我有一些其他问题似乎不容易解决的问题。
我有一个 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
。