因此,如果我们附加,我们必须在完成后分离线程,对吗?
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()
有什么好处答案 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
将导致崩溃。