ですから、アタッチする場合は、終了後にスレッドをデタッチする必要がありますよね?
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()を使用する利点