我在JNI代码中看到了这个警告:
JNI WARNING: 0x44be7258 is not a valid JNI reference
我将JNI中的FindClass方法返回的LocalReference分配给构造函数中的类成员变量:
标题
...
jclass m_class;
.cpp的:
m_class = env->FindClass( classSignature );
FindClass是否返回LocalReference并将其存储在我的类成员变量中是无效的?
答案 0 :(得分:2)
从the Liang book开始,第5.1.1章“本地参考”
大多数JNI函数都创建本地引用...本地引用仅在创建它的本机方法的动态上下文中有效,并且仅在本机方法的一次调用中有效。一旦本机方法返回,将释放在执行本机方法期间创建的所有本地引用。
后面是一个非法的代码示例,它完全使用您的方法FindClass
。换句话说,是的,FindClass
返回本地引用。在下一章中,创建了一个可以按照您想要的方式使用的全局引用的示例。当你不再需要它时,不要忘记DeleteGlobalRef
。否则JVM无法对其进行GC,并且您的程序将泄漏。