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 (фото), так и видео (видео), и это работает в обоих случаях.

Другие вопросы по тегам