我有使用C库和JNI的Java应用程序。
我向JNI发送一个String并希望他返回jdoubleArray。
JNIEXPORT jdoubleArray JNICALL Java_com_1funcA (JNIEnv *env, jclass class, jstring text){
const char *a = (*env)->GetStringUTFChars(env, text, 0);
char *b;
funcB(a, &b);
c_array c;
c.data = b;
c.count = strlen(b);
d_array d = funcA(c);
(*env)->ReleaseStringUTFChars(env, text, a);
jdoubleArray java_buffer = (*env)->NewDoubleArray(env, d.count);
(*env)->SetDoubleArrayRegion(env, java_buffer, 0, d.count, d.doubleArr);
free(d.doubleArr);
free(b);
return java_buffer;}
它可以正常工作,但这些行存在内存泄漏。
jdoubleArray java_buffer = (*env)->NewDoubleArray(env, d.count);
将java_buffer返回给java,所以我不能在这里发布它。 似乎GC不会释放他。
我已关注this和this,但我找不到正确的方法来阻止内存泄漏。
我尝试将其更改为全局参考, 也尝试在一个线程内执行此操作并尝试分离它但仍然收到相同的结果。
答案 0 :(得分:1)
这不是泄漏。 NewDoubleArray
创建一个本地引用。由于https://docs.oracle.com/javase/8/docs/technotes/guides/jni/spec/functions.html#local_references表示“本地引用在本机方法调用的持续时间内有效”。本机方法返回时删除本地引用。 Java端为它创建了一个新的引用,因此它不会太快收集垃圾。一旦Java也不再引用该对象,它将有资格进行垃圾收集。
请注意,如果您创建全局引用并且永远不会再删除它,那么您确实会创建泄漏。