2013-02-06 15 views
1

我无法摆脱这种错误信息的JNI过时的本地引用错误访问主叫对象

JNI ERROR(APP错误):访问过时的本地参考0X ...(INDEX ...)

我试图从本地访问JNR调用者类(它是一个Java线程)的isInterrupted()方法。线程循环完全是本地的,产生其他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

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

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

+0

很好的捕捉。现在它可以与本地引用一起工作,既可以使用非静态本地方法,也可以使用当前线程作为显式参数。谢谢。 – hanswe

相关问题