gpt4 book ai didi

android - 访问调用者对象的 JNI 陈旧本地引用错误

转载 作者:行者123 更新时间:2023-11-30 03:47:30 25 4
gpt4 key购买 nike

我无法摆脱这个错误信息

JNI ERROR (app bug): accessed stale local reference 0x... (index ...)

我正在尝试从 native 访问 JNI 调用程序类的 isInterrupted() 方法,这是一个 Java 线程。线程循环完全是 native 的,产生其他 pthreads 并持有互斥体。我需要一种方法让主要的 Android Activity 通知线程它应该停止,例如在第一个安全时刻由 Java 的 interrupt() 调用。

场景非常简单干净,字里行间没有发生其他事情:

public class MyThread extends Thread {
public native static int native_world_entry();
public void run() {
native_world_entry();
}
static {
System.loadLibrary("mylib");
}
}

native 代码如下:

jint Java_..._1entry(JNIEnv* env, jobject thiz) {
//jobject jj = (*env)->NewGlobalRef(env, thiz);
jclass sclass = (*env)->FindClass(env, "java/lang/Thread");
jmethodID inted = (*env)->GetMethodID(env, sclass, "isInterrupted", "()Z");
LOGI("Checking");
jboolean status = (*env)->CallBooleanMethod(env, thiz, inted);
...
}

一切正常,直到 CallBooleanMethod() 之前的调用成功并显示“正在检查”。我尝试添加注释行并相应地更改 CallBooleanMethod() 的参数,但错误是相同的。

除了错误之外,我不明白为什么在这种情况下需要全局引用。感谢任何帮助。

最佳答案

我认为这是因为 native_world_entry 是静态的。所以thiz不是MyThread istance。它是 MyThread 类实例。向 native_world_entry 方法添加额外参数以显式传递线程处理程序,例如native_world_entry(这个)。

附言您也可以使用 Thread.currentThread() 来获取当前线程。

关于android - 访问调用者对象的 JNI 陈旧本地引用错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14735585/

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