Android, Google JNI сбой картона во время выполнения
Я получаю следующую ошибку при интеграции Cardboard в мое приложение для Android. (Я запускаю его на Samsung S6/Note 3/Nexus 6)
... D/CardboardViewNativeImpl﹕ NativeProxy not found
... D/CardboardViewNativeImpl﹕ Loading native library vrtoolkit
... D/CardboardViewNativeImpl﹕ Native library loaded
... W/art﹕ Attempt to remove local handle scope entry from IRT, ignoring
... W/art﹕ Attempt to remove local handle scope entry from IRT, ignoring
... W/art﹕ Attempt to remove local handle scope entry from IRT, ignoring
... A/art﹕ art/runtime/check_jni.cc:65] JNI DETECTED ERROR IN APPLICATION: GetMethodID received null jclass
... A/art﹕ art/runtime/check_jni.cc:65] in call to GetMethodID
... A/art﹕ art/runtime/check_jni.cc:65] from long com.google.vrtoolkit.cardboard.CardboardViewNativeImpl.nativeInit(int, int, float, float, float, long)
... A/art﹕ art/runtime/check_jni.cc:65] "main" prio=5 tid=1 Runnable
... A/art﹕ art/runtime/check_jni.cc:65] | group="main" sCount=0 dsCount=0 obj=0x73617000 self=0xb4827800
... A/art﹕ art/runtime/check_jni.cc:65] | sysTid=24304 nice=0 cgrp=default sched=0/0 handle=0xb6f04bec
... A/art﹕ art/runtime/check_jni.cc:65] | state=R schedstat=( 1668176075 289166273 1700 ) utm=148 stm=18 core=1 HZ=100
... A/art﹕ art/runtime/check_jni.cc:65] | stack=0xbe04a000-0xbe04c000 stackSize=8MB
... A/art﹕ art/runtime/check_jni.cc:65] | held mutexes= "mutator lock"(shared held)
У меня также есть добавленные abiFilters, так как файл cardbaord.jar содержит файл.so только для armeabi-v7a. Но все равно получаю ошибку.
buildTypes {
debug {
...
ndk {
abiFilters "armeabi-v7a" // includes ARM SO files only, so no x86 SO file
}
}
Мне удалось создать отдельное приложение cardbaord и без проблем запустить его на всех трех устройствах, только когда я интегрировал его в существующее приложение, во время выполнения которого произошел сбой.
2 ответа
У меня точно такая же проблема, что он работает в автономном режиме, но разрывается с "GetMethodID полученный ноль jclass", когда я интегрирую его в существующее приложение.
Оказывается, я включил ProGuard в интегрированном приложении, добавив следующее правило:
-keep class com.google.vrtoolkit.cardboard.** { *; }
Для нового Cardboard SDK 0.8.0 мне пришлось добавить следующие правила ProGuard:
-keep class com.google.vr.**
-keepclassmembers class com.google.vr.** { *; }
-keep class com.google.vr.**$*
-keepclassmembers class com.google.vr.**$* { *; }
-keep class com.google.geo.render.**
-keepclassmembers class com.google.geo.render.** { *; }
# Also keept this rule, just in case (probably only needed for 0.7.0)
-keep class com.google.vrtoolkit.cardboard.** { *; }
Я немного спешил, и из-за этого, возможно, я был слишком "консервативен" в правилах. Я проверил это на примерах как panowidget (фото), так и видео (видео), и это работает в обоих случаях.