jmethodID的NewGlobalRef(NewGlobalRef for jmethodID)和DeleteLocalRef

来源:互联网 发布:云计算paas平台 编辑:程序博客网 时间:2024/06/05 13:23

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

0 0