2012-08-10 60 views
1

我看到在我的JNI代碼這樣的警告:JNI本地VS全球參考:是不是有效的JNI參考

JNI WARNING: 0x44be7258 is not a valid JNI reference 

我分配中的JNI通過的findClass方法返回到我的類成員變量LocalReference構造:

部首:

... 
jclass m_class; 

.cpp的:

m_class = env->FindClass(classSignature); 

FindClass是否返回LocalReference並將其存儲在我的類成員變量中是無效的?

回答

2

the Liang book,第5.1.1章「本地參考」

大多數JNI函數創建本地引用...本地參考之內創建它的本地方法的動態範圍內是有效的,並且只在本地方法的一次調用中。一旦本地方法返回,所有在執行本地方法期間創建的本地引用都將被釋放。

後面跟着一個非法代碼示例,它使用了您的方法FindClass。換句話說,是的,FindClass返回一個本地引用。在下面的章節中舉例說明如何創建一個可以以您想要的方式使用的全局引用。當您不再需要時,請不要忘記DeleteGlobalRef。否則JVM不能GC GC,你的程序將泄漏。