我有一些其他问题似乎不容易解决的问题。
我有一个 native 方法,该方法返回Java类(自定义)实例的jobjectArray。
我要做的是获取要实例化并返回的类的jclass,然后获取其构造函数的jmethodID。

native 方法的签名是:

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发布的说明。因此,我正在获取它们的全局引用,以便以后使用。
请注意,我的库中还没有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");

实际错误是:



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

任何帮助,将不胜感激。

谢谢

最佳答案

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

10-01 02:41