DetachCurrentThread在NDK中有时会崩溃

 2023-01-20    443  

问题描述

我借口提出一个非常模糊的问题,但是,我有一个纯粹的本地NDK应用程序,应该以浸入式模式执行(即全屏幕).

当应用程序通过APP_CMD_RESUME恢复应用时,将执行沉浸式模式JNI代码.大多数情况下,这起作用,但是,我的SetImmersiveMode()摘要中时不时地命令activity->vm->DetachCurrentThread()崩溃了,但有一个致命的例外:

DetachCurrentThread在NDK中有时会崩溃

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.setsystemuivisible()应仅从主线程调用. 没有看到您的代码,很难判断distachcurrentthread()是否在此中扮演任何角色.

文档,nativeactivity :: env是应用程序主线程的JNI上下文.

您应该在终止附加到JVM的本机线程之前致电DetachCurrentThread()

您不应该在Java出生的线程上调用DetachCurrentThread),例如UI线程.

请注意,您可以随时随地在任何线程上调用AttachCurrentThread().它等于在Java线程或附带的线程上NOP.

这些连接/分离不像括号那样配对.任何数量的附件呼叫都会通过单个独立式逆转. 推荐练习练习:

使用pthread_key_create来定义destructor函数,该函数将在线程退出之前被调用,然后从那里调用DetachCurrentThread. (使用pthread_setspecific使用该键将JNIENV存储在线程 – 本地存储中;这样,它将被作为参数传递到destructor中.)

请参阅Webrtc如何处理 git web repo .

以上所述是小编给大家介绍的DetachCurrentThread在NDK中有时会崩溃,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对77isp云服务器技术网的支持!

原文链接:https://77isp.com/post/26007.html

=========================================

https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。