【问题标题】:DetachCurrentThread crashes sometimes in NDKDetachCurrentThread 有时在 NDK 中崩溃
【发布时间】:2018-09-14 21:47:04
【问题描述】:

原谅我提出了一个非常模糊的问题,但是,我有一个纯原生 NDK 应用程序,它应该在沉浸式模式(即全屏)下执行。

通过APP_CMD_RESUME 恢复应用时,会执行沉浸式模式 JNI sn-p。这在大多数情况下都有效,但是,我的 activity->vm->DetachCurrentThread() 中的命令 activity->vm->DetachCurrentThread() 时不时地崩溃,并出现致命异常:

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】:

    View.setSystemUiVisibility() 只能从主线程调用。 没有看到您的代码,很难判断 DetachCurrentThread() 是否在其中发挥了任何作用。

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

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

    你不应该在 Java 生成的线程上调用 DetachCurrentThread),例如用户界面线程。

    请注意,您可以随时在任何线程上调用AttachCurrentThread()。它相当于 Java 线程或附加线程上的 NOP。

    这些附加/分离不像括号那样配对。任何数量的附加调用都可以通过单次分离来反转。 recommended实践:

    使用pthread_key_create 定义将在线程退出之前调用的析构函数,并从那里调用DetachCurrentThread。 (使用该键和pthread_setspecific 将 JNIEnv 存储在 thread-local-storage 中;这样它将作为参数传递到您的析构函数中。)

    在他们的git Web repo 中查看 WebRTC 如何处理附加/分离。

    【讨论】:

    • 谢谢,嗯,我的问题是根据文档,APP_CMD_RESUME 来自主线程:/(更新问题)
    • 如果你在主线程上处理这个回调,这不是你可以附加的线程,DetachCurrentThread()是如何参与的?
    • 你的意思是我根本不能从主线程执行 jni,或者我应该使用 android_app->actitvity->env 而不附加? (似乎崩溃了)
    • 根据文档,ANativeActivity::env 是应用程序主线程的 JNI 上下文。在任何时间和任何线程上调用AttachCurrentThread() 通常都不是问题。它将等效于 Java 线程或附加线程上的 NOP。但是你不能在 Java 生成的线程上调用 DetachCurrentThread),例如UI 线程。
    • 注意相反的question
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-12
    • 2018-09-05
    相关资源
    最近更新 更多