JNI参数是本地或全局引用

giv*_*ivi 1 java java-native-interface android android-ndk

我已经阅读了一些有关JNI中本地和全局引用的参考。但是我找不到确切的答案,作为参数传递给JNI函数的Java对象是本地还是全局引用。我以为应该是全球性的,但是有一个问题:

首先,我获取Java对象指针并将其保存。然后,本机回调函数将调用该对象的方法。回调函数是从单独的线程中调用的。该线程是使用AttachCurrentThread()创建的,因此JVM知道它。JNIEnv *变量也有效,并且该对象未进行垃圾回收,但是我得到警告,然后崩溃。

JNI警告:0x4108edb8在Lcom / my / company / MyClass; .load:(Ljava / lang / String;)V(GetObjectClass)中不是有效的JNI引用

use*_*421 5

  1. 这是本地参考。“对象作为本地引用传递给本机方法”

  2. JNIEnv *指针对JNI方法调用边界无效,更不用说线程边界了。

  3. 在这种情况下,您必须将本地引用转换为全局引用,以供回调方法使用。