我无法摆脱此错误消息
JNI ERROR(app bug):访问陈旧的本地引用0x ...(索引...)
我正在尝试从本地访问JNI调用者类的isInterrupted()
方法,这是一个Java线程。线程循环完全是原生的,产生其他pthreads并保存互斥锁。我需要一种方法让主要的Android活动通知线程它应该停止,例如在第一个安全时刻由Java interrupt()
提供。
场景非常简单干净,线之间没有其他事情发生:
public class MyThread extends Thread {
public native static int native_world_entry();
public void run() {
native_world_entry();
}
static {
System.loadLibrary("mylib");
}
}
本机代码如下:
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()
的参数,但错误是相同的。
除了错误之外,我没有理解为什么在这种情况下需要全局引用的原因..感谢任何帮助。
答案 0 :(得分:1)
我认为这是因为native_world_entry是静态的。所以thiz不是MyThread。它是MyThread类实例。 向native_world_entry方法添加额外的参数以明确地传递线程处理程序,例如native_world_entry(本)。
P.S。您还可以使用Thread.currentThread()来获取当前线程。