DetachCurrentThread有时会在NDK中崩溃
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DetachCurrentThread有时会在NDK中崩溃相关的知识,希望对你有一定的参考价值。
我原谅提出一个相当模糊的问题,但是,我有一个纯粹的原生NDK应用程序,应该在沉浸模式下执行(即全屏)。
当应用程序通过APP_CMD_RESUME
恢复时,将执行沉浸式模式JNI片段。这大部分时间都可以工作,但是,我的activity->vm->DetachCurrentThread()
片段中的命令SetImmersiveMode()
偶然发生了致命的异常:
FATAL EXCEPTION: Thread-10
Process: com.toppluva.portis.LocalDebug, PID: 5474
android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:7380)
at android.view.ViewRootImpl.recomputeViewAttributes(ViewRootImpl.java:3478)
at android.view.View.setSystemUiVisibility(View.java:22587)
这真让我感到困惑,主要是因为它时不时地发生,我如何检测我是否从这个原始线程执行?
请注意,根据文档APP_CMD_RESUME
从主线程执行。
应仅从主线程调用View.setSystemUiVisibility()。 在没有看到你的代码的情况下,很难判断DetachCurrentThread()是否扮演任何角色。
文档,ANativeActivity :: env是应用程序主线程的JNI上下文。
您应该在终止附加到JVM的本机线程之前调用DetachCurrentThread()
。
你不应该在Java出生的线程上调用DetachCurrentThread)
,例如UI线程。
请注意,您可以随时在任何线程上调用AttachCurrentThread()
。它将等同于Java线程或附加线程上的NOP。
这些附加/分离不像括号那样配对。单个分离可以反转任意数量的附加呼叫。 recommended练习:
使用
pthread_key_create
定义一个析构函数,该函数将在线程退出之前调用,并从那里调用DetachCurrentThread
。 (将该密钥与pthread_setspecific
一起使用以将JNIEnv存储在线程本地存储中;这样它将作为参数传递到析构函数中。)
了解WebRTC如何处理其git Web repo中的附加/分离。
以上是关于DetachCurrentThread有时会在NDK中崩溃的主要内容,如果未能解决你的问题,请参考以下文章
Android JNI - 调用AttachCurrentThread而不使用DetachCurrentThread
“DetachCurrentThread”是否清除了本地引用?
(g_jvm)->AttachCurrentThread(&env, NULL) 后使用 (g_jvm)->DetachCurrentThread();程序报错