JavaがCで書かれたライブラリにアクセスできるようにするラッパーを書いています。
JNI呼び出しの間に永続的な配列が必要です。呼び出し間で配列アドレスを保持しています。この方法は非常にうまく機能します。私の主な関心事は、配列がJavaからjniにコピーされ、メモリがJVMによって解放されると同時に、コピーがヒープに残り、参照できるようになり、後で解放されることです。
ここに2つの機能があります。方法論は正しいですか、それともこれを達成するためのより効率的な方法がありますか?
Cへの配列のインポート:
JNIEXPORT jlong JNICALL
Java_Matcher_FlannLoadData(JNIEnv *env, jobject obj, jfloatArray d, jint r, jint c)
{
int rows = (int)r;
int cols = (int)c;
float *jdataset = (*env)->GetFloatArrayElements(env,d,0);
float *cdataset = malloc(rows*cols*sizeof(float));
memcpy(cdataset,jdataset,rows*cols*sizeof(float));
(*env)->ReleaseFloatArrayElements(env,d,jdataset,0);
return (long)cdataset;
}
空きメモリ:
JNIEXPORT void JNICALL
Java_Matcher_FlannFreeData(JNIEnv *env, jobject obj, jlong d)
{
free((float*)d)
}