NDK app onDestroy清理 - 如何DetachCurrentThread

时间:2012-10-22 11:58:23

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

因此,如果我们附加,我们必须在完成后分离线程,对吗?

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类的 @Override protected void 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或垃圾清理器将如何处理这个问题?

P.S。使用 AttachCurrentThreadAsDaemon()

有什么好处

2 个答案:

答案 0 :(得分:3)

在UI线程上调用Activity.onDestroy()方法。为什么要尝试从UI线程中分离Java VM?该线程由系统管理,您既不应该将Java VM附加到它上面,也不应该将它从中分离出来。

JNIEnv*作为第一个参数可用于每个本机方法。你为什么首先需要get_jni_env()

如果你需要在工作线程上使用JNIEnv,那么你需要附加和分离(或者从Java生成一个线程;这很容易)。

编辑:如果是重复附件,则无需分离。这不是一个重新计算的系统。 AttachCurrentThread记录为

  

尝试附加已经附加的线程是无操作。

与要求匹配的附加/分离呼叫相反。

答案 1 :(得分:1)

请勿从主JNI handler function致电thread。从主线程调用JNI handler function将导致崩溃。