C++側でロードした vector<vector <KeyPoint>> の参照を、Javaで保存し、必要に応じて C++ 側へ渡して vector<vector <KeyPoint>> から KeyPoint を取り出して処理をするプログラムをつくろうとしていますが、vector の参照を使ってうまくデータを再利用できなくて困っています。
※ KeyPoint は OpenCV の class です。
http://docs.opencv.org/modules/features ... t#KeyPoint
処理は以下のようにしています。
C++ で、vector<vector<KeyPoint>> をロードする関数を作成し、JNIインターフェースを作成します。
戻り値は、vector<vector<KeyPoint>> keypoints_listの参照です。
JNIEXPORT jlong JNICALL
Java_jp_jni_Load_loadKeypoints(JNIEnv *env, jobject jObj, jstring path) {
TickMeter tm;
tm.start();
cout << "Keypoints Load start." << endl;
vector<vector<KeyPoint>> keypoints_list;
const char* keypoints_path_native = env->GetStringUTFChars(path, JNI_FALSE);
string keypoints_path = string(keypoints_path_native);
FileStorage fs_keypoints(keypoints_path, FileStorage::READ);
FileNode n_keypoint = fs_keypoints.root();
int class_cnt_keypoint = static_cast<int>(fs_keypoints["class_cnt"]);
for (int i = 0; i < class_cnt_keypoint; i++) {
vector < KeyPoint > v;
FileNode node_keypoint_vec = fs_keypoints["keypoints" + itos(i)];
read(node_keypoint_vec, v);
keypoints_list.push_back(v);
}
fs_keypoints.release();
tm.stop();
double trainTime = tm.getTimeMilli();
cout << "Keypoints Load end." << endl;
cout << "load time: " << dtos(trainTime) << " (ms)" << endl;
return (jlong)&keypoints_list[0];
}
上記で受け取った long を、別の処理で引数 jlong native_keypoints として渡して、vector<vector<KeyPoint>> を使用しようとしています。
JNIEXPORT jstring JNICALL
Java_jp_jni_Detect_detect (JNIEnv *env, jobject jObj, jlong native_keypoints){
vector<vector<KeyPoint>>& keypoints_list = (vector<vector<KeyPoint>>&)native_keypoints;
int keypoints_list_size = keypoints_list.size();
cout << "keypoints cnt: " << keypoints_list_size << endl;
vector<KeyPoint> keypoints = keypoints_list[0]; ←★エラー発生箇所
…
}
#
# A fatal error has been detected by the Java Runtime Environment:
#
# SIGSEGV (0xb) at pc=0x00007fbc5ed5625e, pid=6487, tid=140447579678464
#
# JRE version: 7.0-b147
# Java VM: Java HotSpot(TM) 64-Bit Server VM (21.0-b17 mixed mode linux-amd64 compressed oops)
# Problematic frame:
# C [libLoadDictionary.so+0x2725e] std::vector<cv::KeyPoint, std::allocator<cv::KeyPoint> >::size() const+0xc
#
# Failed to write core dump. Core dumps have been disabled. To enable core dumping, try "ulimit -c unlimited" before starting Java again
#
# An error report file with more information is saved as:
# /root/git/jni/hs_err_pid6487.log
#
# If you would like to submit a bug report, please visit:
# http://bugreport.sun.com/bugreport/crash.jsp
# The crash happened outside the Java Virtual Machine in native code.
# See problematic frame for where to report the bug.
#
また、エラーの原因をアドバイスいただけますと嬉しいです。
よろしくお願いします。