7

我有一个问题,否则这似乎是一件容易的事。我有一个本机方法,它返回 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,我将按照此处发布的说明进行操作。所以我得到了他们的全球参考,所以我以后可以使用它们。请注意,我的库中还没有 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): decodeIndirectRef 06-14 09:17:26.648 中的无效间接引用 0x4c0bdc40: E/dalvikvm(26012): VM 中止

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

对此的任何帮助将不胜感激。

谢谢

4

1 回答 1

17

AjmethodID不是一个对象。您无需将其转换为GlobalRef. 同上jfieldID

于 2012-06-14T10:20:16.163 回答