jmethodID的NewGlobalRef(NewGlobalRef for jmethodID)和DeleteLocalRef

一开始我以为所有的引用在JNI中都是分成三个等级的引用分类。我的需求是为了提高全局jmethodID 变量在一个函数执行完后还可以用。所以用下面这个方法希望可以转换为全局引用。

jobject     (*NewGlobalRef)(JNIEnv*, jobject);

但是总是报错

JNI DETECTED ERROR IN APPLICATION: native code passing in reference to invalid stack indirect reference table or invalid reference: 0xfff5f1b0
in call to NewGlobalRef

一直找不到解决办法。
后来这篇文章说jmethodID没有全局引用这个玩意,因为他不是jobject这个类型变量,一看果然是。jobject其实就是void *指针。而jmethodID是一个结构体。

所以最后说不要尝试给jmethodID转换为全局引用,以及释放jmethodID类型变量。能转变为全局引用的必定是jobject及其变种,说白了就是实例。如下:

/*
 * Reference types, in C.
 */
typedef void*           jobject;
typedef jobject         jclass;
typedef jobject         jstring;
typedef jobject         jarray;
typedef jarray          jobjectArray;
typedef jarray          jbooleanArray;
typedef jarray          jbyteArray;
typedef jarray          jcharArray;
typedef jarray          jshortArray;
typedef jarray          jintArray;
typedef jarray          jlongArray;
typedef jarray          jfloatArray;
typedef jarray          jdoubleArray;
typedef jobject         jthrowable;
typedef jobject         jweak;

参考:
stackoverflow
blog

jmethodID不能转换为全局引用,也不用释放。

你可能感兴趣的:(AndroidNDK)