NDK 应用 onDestroy 清理 - 如何 DetachCurrentThread

2024-05-24

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

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;
}

我从调用下一个本机方法@Override protected void onDestroy()我的活动课

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

错误:使用插帧分离线程(计数=16)- 主线程仍在运行,我们尝试将其分离。

即使我们使用任何使用 JNIEnv 的函数(例如调用 java 方法),放置 DetachCurrentThread 也会导致相同的错误。

分离当前线程如果使用的话可以完美地工作并行线程函数

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 完成,有吗?或者然后 Activity 将被销毁,它会通过 JavaVM 释放自身?我们是否需要调用 DestroyJavaVM() (如果使用 onDestroy,则只是崩溃),免费缓存的 JavaVM 或垃圾清理器将如何处理这个问题?

附:使用有什么好处AttachCurrentThreadAsDaemon()


The Activity.onDestroy()方法在 UI 线程上调用。为什么要尝试将 Java VM 与 UI 线程分离?该线程由系统管理,您不应在其上附加或分离 Java VM。

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

如果您需要在工作线程上使用 JNIEnv,那么您需要附加和分离(或者从 Java 生成一个线程;这非常简单)。

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

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

与要求匹配的附加/分离调用相反。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

NDK 应用 onDestroy 清理 - 如何 DetachCurrentThread 的相关文章

随机推荐