gpt4 book ai didi

c - JNI NewDoubleArray 内存泄漏

转载 作者:行者123 更新时间:2023-11-30 15:06:16 25 4
gpt4 key购买 nike

我有 Java 应用程序,它使用带有 JNI 的 C 库。

我向 JNI 发送一个字符串并希望他返回 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好像并没有释放他。

我已关注thisthis但我没有找到阻止内存泄漏的正确方法。

我尝试将其更改为全局引用,也尝试在线程内执行此操作并尝试将其分离,但仍然收到相同的结果。

最佳答案

这不是泄漏。 NewDoubleArray 创建本地引用。如https://docs.oracle.com/javase/8/docs/technotes/guides/jni/spec/functions.html#local_references声明“本地引用在 native 方法调用期间有效。”当 native 方法返回时,本地引用将被删除。 Java 端为其创建一个新的引用,因此它不会太快被垃圾回收。一旦 Java 也不再引用该对象,它将有资格进行垃圾回收。

请注意,如果您创建一个全局引用并且不再删除它,您确实会造成泄漏。

关于c - JNI NewDoubleArray 内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39268722/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com