gpt4 book ai didi

java - JNI - native 方法中的 fatal error : Bad global or local ref passed to JNI

转载 作者:太空宇宙 更新时间:2023-11-04 01:50:01 25 4
gpt4 key购买 nike

我检查了这个错误的相关问题,但找不到答案。我有以下代码。该错误与调用 jLog 方法有关,如果我将其删除,错误就消失了,所以我不明白是什么问题——这只是我第一次使用 JNI 的经历:

static jclass util_class;
static jmethodID log_from_jni;
...
util_class = (*env)->FindClass(env, "package/Util");
if ((*env)->ExceptionOccurred(env)) {
printf("Error occured when loading Util class\n");
}
log_from_jni = (*env)->GetStaticMethodID(env, util_class,
"logFromJNI", "(Ljava/lang/String;)V");

if ((*env)->ExceptionOccurred(env)) {
printf("Error occured when loading logFromJNI method\n");
}
...

void jLog(JNIEnv *env, char* cstr) {
if (util_class != NULL || log_from_jni != NULL) {
jstring str = (*env)->NewStringUTF(env, cstr);
(*env)->CallStaticVoidMethod(env, util_class, log_from_jni, str);
} else {
printf(cstr);
}

}

JNIEXPORT void JNICALL Java_package_callLog(JNIEnv * env, jobject obj) {\
jLog(env, "JNI: Log");//
}

谢谢。

最佳答案

jclass 只是另一个 Java 堆对象,这意味着它可以被垃圾收集器移动,这将使您保存的 utill_class 基本上成为一个悬空指针。

如果你想要一个保持有效的jclass,你需要为它创建一个全局引用:

util_class = (jclass) (*env)->NewGlobalRef(env, (*env)->FindClass(env, "package/Util"));

关于java - JNI - native 方法中的 fatal error : Bad global or local ref passed to JNI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45485117/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com