我正在编写一个包装器以允许 Java 访问用 C 编写的库。
JNI 调用之间需要有一个持久数组。我在调用之间保留数组地址。这种方法效果很好。我主要担心的是,当数组从 java 复制到 jni 时,JVM 会释放内存,但同时副本会保留在我可以引用的堆上,然后在我完成后释放。
这是两个功能,方法是正确的还是有更有效的方法来做到这一点?
数组导入到 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)
}