Java NewStringUTF()和释放内存

Java NewStringUTF()和释放内存,java,java-native-interface,Java,Java Native Interface,在将分配的字符串传递到NewStringUTF()后是否应释放该字符串 我有一些类似的代码: char*测试; jstring j_试验; 测试=某些函数();//NewStringUTF(环境、测试); 免费(测试);// NewStringUTF()的const char*参数的存储完全由您负责:如果您使用malloc()分配了test,那么您需要free()它。因此,您发布的代码片段是正确的。你正在其他地方腐蚀垃圾堆 我看到相互矛盾的意见。有人说我 有人说虚拟机应该自己释放它 释放它,有人

在将分配的字符串传递到
NewStringUTF()后是否应释放该字符串

我有一些类似的代码:

char*测试;
jstring j_试验;
测试=某些函数();//NewStringUTF(环境、测试);

免费(测试);//
NewStringUTF()
const char*
参数的存储完全由您负责:如果您使用
malloc()
分配了
test
,那么您需要
free()
它。因此,您发布的代码片段是正确的。你正在其他地方腐蚀垃圾堆

我看到相互矛盾的意见。有人说我 有人说虚拟机应该自己释放它 释放它,有人说虚拟机没有释放 它和你应该做奇怪的巫毒 释放它的魔法。我很困惑

他们正在讨论由
NewStringUTF()
返回的
jstring
实例。这遵循了令人困惑的规则

完成此引用后,使用
DeleteLocalRef()
释放此引用决不是错误。但是,如果在JVM线程的上下文中调用
NewStringUTF()
,JVM会执行一些可疑的魔法。当本机方法返回Java时,任何泄漏的本地引用都会自动清除。因此,如果确定最终调用方位于Java线程中,那么可以安全地泄漏引用


另一方面,如果您是在本机线程的上下文中运行的(例如,某个事件报告线程回调Java),则永远不会返回Java,因此您必须自己在这个
jstring
上调用
DeleteLocalRef()。我现在知道我的问题在哪里了。我需要一个更持久的jstring。一个成为垃圾收集器的一部分,并且只有在我真正处理完之后才被清理的垃圾收集器。是否有过这样的情况:在使用
NewStringUTF()
获得的
jstring
上调用
DeleteLocalRef()
是不安全的/不正确的?@namuol如果以后要将jstring传递给java,您现在不应该删除它。旁注:jni保存本地引用的条目是有限的,所以最好在您不需要本地引用时立即删除它。想象一下,下面的代码将导致(inti=0;i<100000;i++){callToJava(NewStringUTF(…)})
崩溃
,jni会抱怨本地引用太多。Push/PopLocalFrame是您的朋友,尤其是在使用非JVM线程时。它处理足够的本地引用空间的分配,以及自动清理仍然悬空的任何本地引用。