我遇到了一些问题,否则这似乎是一件容易的事。 我有一个本机方法,它返回一个Java类(自定义)实例的jobjectArray。 我所做的是获取我想要实例化的类的jclass并返回,然后为它的构造函数获取jmethodID。
本机方法的签名是:
JNIEXPORT jobjectArray JNICALL
Java_com_mn_rootscape_utils_NativeMethods_getFilesPermissions( JNIEnv* env, jobject thizz, jobjectArray filePathsArray )
命名空间和构造函数签名定义如下:
const char* kFilePermissionInfoPath = "com/mn/rootscape/utils/FilePermissionInfo";
const char* kFilePermInfoConstructorSig = "(IIIIIJJJLjava/lang/String;Ljava/lang/String;ZLjava/lang/String;)V";
对于jclass和jmethodID,我按照here发布的说明进行操作。所以我得到他们的全球参考,以便我以后可以使用它们。 请注意,我的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");
实际错误是:
06-14 09:17:26.648:W / dalvikvm(26012):间接参考无效 0x4c0bdc40在decodeIndirectRef 06-14 09:17:26.648:E / dalvikvm(26012): VM中止
gFilePermInfoClass和gFilePermInfoClsConstructor是全局jclass和jmethodID对象,用于保存全局引用。
任何帮助都将不胜感激。
由于
答案 0 :(得分:15)
jmethodID
不是对象。您无需将其转换为GlobalRef
。同上jfieldID
。