DetachCurrentThread有时会在NDK中崩溃

问题描述 投票:4回答:1

我原谅提出一个相当模糊的问题,但是,我有一个纯粹的原生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从主线程执行。

android android-ndk java-native-interface android-fullscreen
1个回答
4
投票

应仅从主线程调用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中的附加/分离。

© www.soinside.com 2019 - 2024. All rights reserved.