3

ですから、アタッチする場合は、終了後にスレッドをデタッチする必要がありますよね?

JNIEnv* get_jni_env()
{
JNIEnv* res;
JAVA_VM->GetEnv((void**) &res, JNI_VERSION_1_6);//Using cached JavaVM
JAVA_VM->AttachCurrentThread(&res, NULL);
return res;
}

Activityクラスの@Overrideprotectedvoid onDestroy()から次のネイティブメソッドを呼び出します

 void free_jni_manager()
 {
   JNIEnv* env = get_jni_env();
   ... //Here i delete global refs (jclass)
  //JAVA_VM->DetachCurrentThread();
 }

エラー:interpフレームを使用してスレッドをデタッチします(count = 16) -メインスレッドはまだ実行中であり、デタッチしようとします。

JNIEnvを使用する関数(たとえば、javaメソッドの呼び出し)を使用する場合でも、DetachCurrentThreadを配置すると同じエラーが発生します。

DetachCurrentThreadは、 pthread関数で使用すると問題なく機能します

static void* thread_func(void* arg)
{
 get_jni_env(); // attach new thread
 //Do thread stuff
 JAVA_VM->DetachCurrentThread();//thread done detached it with ok
 return NULL;
}

メインスレッドをデタッチする必要がありますか?それからJNIで行いますか?または、アクティビティが破棄され、JavaVMで解放されますか?DestroyJavaVM()を呼び出す必要がありますか(onDestroyを使用するとクラッシュするだけです)、キャッシュされた無料のJavaVMまたはガベージクリーナーがこれをどのように処理しますか?

PS AttachCurrentThreadAsDaemon()を使用する利点

4

2 に答える 2

3

このActivity.onDestroy()メソッドはUIスレッドで呼び出されます。なぜJavaVMをUIスレッドから切り離そうとしているのですか?そのスレッドはシステムによって管理されているため、JavaVMをスレッドに接続したり切り離したりしないでください。

JNIEnv*、すべてのネイティブメソッドで最初のパラメータとして使用できます。get_jni_env()そもそもなぜ必要なのですか?

ワーカースレッドでJNIEnvが必要な場合は、アタッチおよびデタッチする必要があります(または、Javaからスレッドを生成します。非常に簡単です)。

編集:それが繰り返しの添付ファイルである場合は、切り離す必要はありません。参照カウントシステムではありません。AttachCurrentThreadとして文書化されています

すでに接続されているスレッドを接続しようとしても、何もできません。

一致するアタッチ/デタッチ呼び出しを要求するのとは対照的です。

于 2012-10-22T16:59:02.917 に答える
1

JNI handler functionmain から呼び出さないでくださいthread。メインスレッドから呼び出すJNI handler functionとクラッシュします。

于 2016-04-12T12:53:30.977 に答える