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

时间:2013-02-06 17:51:32

标签: android android-ndk java-native-interface

我无法摆脱此错误消息

  

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()的参数,但错误是相同的。

除了错误之外,我没有理解为什么在这种情况下需要全局引用的原因..感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

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

P.S。您还可以使用Thread.currentThread()来获取当前线程。