适用于jmethodID的NewGlobalRef

Mar*_* N. 5 java-native-interface android android-ndk

我有一个问题,否则似乎是一件容易的事.我有一个本机方法,它返回一个Java类(自定义)实例的jobjectArray.我所做的是获取我想要实例化的类的jclass并返回,然后获取它的构造函数的jmethodID.

本机方法的签名是:

JNIEXPORT jobjectArray JNICALL
Java_com_mn_rootscape_utils_NativeMethods_getFilesPermissions( JNIEnv* env, jobject thizz, jobjectArray filePathsArray ) 
Run Code Online (Sandbox Code Playgroud)

命名空间和构造函数签名定义如下:

const char* kFilePermissionInfoPath = "com/mn/rootscape/utils/FilePermissionInfo";
const char* kFilePermInfoConstructorSig = "(IIIIIJJJLjava/lang/String;Ljava/lang/String;ZLjava/lang/String;)V";
Run Code Online (Sandbox Code Playgroud)

对于jclass和jmethodID,我按照这里发布的说明操作.所以我得到他们的全球参考,以便我以后可以使用它们.请注意,我的lib中还没有oninit,代码现在只是用于测试.

问题是当我尝试检索jmethodID的全局引用时,我遇到了分段错误.

执行此操作的代码是:

jclass filePermInfoCls = (*env)->FindClass(env, kFilePermissionInfoPath);
if(!filePermInfoCls)
{
    LOGE("getFilesPermissions: failed to get class reference.");
    return NULL;
}

gFilePermInfoClass = (jclass)(*env)->NewGlobalRef(env, filePermInfoCls);
LOGI("got gFilePermInfoClass");

jmethodID filePermInfoClsConstructor = (*env)->GetMethodID(env, gFilePermInfoClass, "<init>", kFilePermInfoConstructorSig1);
if(!filePermInfoClsConstructor)
{
    LOGE("getFilesPermissions: failed to get method reference.");
    return NULL;
}

gFilePermInfoClsConstructor = (jmethodID)(*env)->NewGlobalRef(env, filePermInfoClsConstructor);
LOGI("got gFilePermInfoClsConstructor");
Run Code Online (Sandbox Code Playgroud)

实际错误是:

06-14 09:17:26.648:W/dalvikvm(26012):decodeIndirectRef中的无效间接引用0x4c0bdc40 06-14:17:26.648:E/dalvikvm(26012):VM中止

gFilePermInfoClass和gFilePermInfoClsConstructor是全局jclass和jmethodID对象,用于保存全局引用.

任何帮助都将不胜感激.

谢谢

use*_*421 15

A jmethodID不是对象.您无需将其转换为GlobalRef.同上jfieldID.