一开始我以为所有的引用在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不能转换为全局引用,也不用释放。
