JNI Local vs Global Reference:不是有效的JNI引用

时间:2012-08-10 19:10:45

标签: reference java-native-interface global local

我在JNI代码中看到了这个警告:

JNI WARNING: 0x44be7258 is not a valid JNI reference

我将JNI中的FindClass方法返回的LocalReference分配给构造函数中的类成员变量:

标题

...
jclass m_class;

.cpp的:

m_class = env->FindClass( classSignature );

FindClass是否返回LocalReference并将其存储在我的类成员变量中是无效的?

1 个答案:

答案 0 :(得分:2)

the Liang book开始,第5.1.1章“本地参考”

  

大多数JNI函数都创建本地引用...本地引用仅在创建它的本机方法的动态上下文中有效,并且仅在本机方法的一次调用中有效。一旦本机方法返回,将释放在执行本机方法期间创建的所有本地引用。

后面是一个非法的代码示例,它完全使用您的方法FindClass。换句话说,是的,FindClass返回本地引用。在下一章中,创建了一个可以按照您想要的方式使用的全局引用的示例。当你不再需要它时,不要忘记DeleteGlobalRef。否则JVM无法对其进行GC,并且您的程序将泄漏。