DetachCurrentThread иногда вылетает в NDK - PullRequest
0 голосов
/ 15 сентября 2018

Я извиняюсь за то, что задаю довольно расплывчатый вопрос, но у меня есть чисто нативное приложение NDK, которое должно выполняться в Режим погружения (то есть в полноэкранном режиме).

Режим погружения JNIФрагмент выполняется, когда приложение возобновляется через APP_CMD_RESUME.Это работает большую часть времени, но время от времени команда 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 выполняется из основного потока.

1 Ответ

0 голосов
/ 15 сентября 2018

View.setSystemUiVisibility () должен вызываться только из основного потока. Не видя ваш код, трудно сказать, играет ли DetachCurrentThread () какую-либо роль в этом.

документация, ANativeActivity :: env - это JNI-контекст для основного потока приложения.

Вы должны вызвать DetachCurrentThread() перед завершением собственного потока, который вы подключили к JVM.

Вы не должны вызывать DetachCurrentThread) в потоке, созданном на Java, например поток пользовательского интерфейса.

Обратите внимание, что вы можете звонить AttachCurrentThread() в любое время и в любом потоке. Это будет эквивалентно NOP в потоке Java или в присоединенном потоке.

Эти присоединения / отсоединения не связаны как скобки. Любое количество вызовов присоединения отменяется одним отключением. рекомендуемая практика:

используйте pthread_key_create для определения функции деструктора, которая будет вызываться до выхода из потока, и оттуда вызывайте DetachCurrentThread. (Используйте этот ключ с pthread_setspecific для хранения JNIEnv в thread-local-storage; таким образом, он будет передан в ваш деструктор в качестве аргумента.)

Посмотрите, как WebRTC обрабатывает присоединение / отсоединение в их git Web repo .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...