1

このエラーメッセージを取り除くことはできません

JNIエラー(アプリのバグ):古いローカル参照0xにアクセスしました...(インデックス...)

isInterrupted()JavaスレッドであるJNI呼び出し元クラスのメソッドにネイティブからアクセスしようとしています。スレッドループは完全にネイティブであり、他の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()それに応じての引数を変更しようとしましたが、エラーは同じです。

エラーのほかに、この場合にグローバル参照が必要な理由がわかりません。助けていただければ幸いです。

4

1 に答える 1

1

native_world_entry が静的だからだと思います。したがって、これは MyThread インスタンスではありません。MyThread クラスのインスタンスです。スレッド ハンドラーを明示的に渡すには、native_world_entry メソッドに追加のパラメーターを追加します (native_world_entry(this) など)。

PS また、 Thread.currentThread() を使用して現在のスレッドを取得することもできます。

于 2013-02-07T08:52:17.693 に答える