1

我无法摆脱此错误消息

JNI 错误(应用程序错误):访问过时的本地引用 0x...(索引...)

我试图从本机访问isInterrupted()JNI 调用程序类的方法,它是一个 Java 线程。线程循环完全是原生的,产生其他 pthread 并持有互斥锁。我需要一种主要Android活动的方法来通知线程它应该interrupt()在第一个安全时刻由Java停止。

该场景非常简单明了,两行之间没有其他任何事情发生:

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()相应地更改 's 参数,但错误是相同的。

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

4

1 回答 1

1

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

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

于 2013-02-07T08:52:17.693 回答