假设我在JNI函数中有这个代码,它实现了一个native
函数存根:
JNIEnv* env; /*This is set to a valid JNIEnv* for this thread*/
jclass clz = env->FindClass("foo"); /*this has worked*/
我是否需要致电
env->DeleteLocalRef(clz);
一旦我完成了它?我没有将clz
返回给Java,所以我认为我需要删除本地引用?这似乎有点奇怪,因为像MethodID
一样,jclass
不包含对象实例。
答案 0 :(得分:4)
调用DeleteLocalRef
永远不会出错,所以你应该总是调用它,否则你可能会遇到本地引用数用尽的情况。
当您从Java调用JNI代码并且它的运行时间很短时,您可能很幸运,在您返回Java调用者后,本地引用会被清除,但是如果您是从本机代码调用Java VM(因此没有“外部”Java VM框架从中调用JNI代码),然后您将快速耗尽本地变量,因为它们永远不会被不存在的Java调用者删除
引用official Java documentation:
在大多数情况下,程序员应该依赖VM在本机方法返回后释放所有本地引用。但是,有时程序员应该明确地释放本地引用。例如,考虑以下情况:
答案 1 :(得分:0)
不,您不需要致电DeleteLocalRef
FindClass
返回本地引用。所以没有必要删除。 JN将在JNI调用完成后自动执行此操作
但是如果你想要你可以删除本地参考。它应该没有任何区别。