Ошибка JNI при анимации перехода на сцену - уровень превышает максимальный

обратите внимание на EDIT в нижней части вопроса

У меня есть 2 действия: ActivityA, ActivityB с соответствующими фразами: FragmentA, FragmentB соответственно. ImageView v разделяется между этими двумя фрагментами.

some Code: ActivityA

Intent intent = new Intent(this, ActivityB.class);
final ActivityOptionsCompat activityOptionsCompat = ActivityOptionsCompat.
                         makeSceneTransitionAnimation(this, imageView, "photo");   

ActivityCompat.startActivity(this, intent, activityOptionsCompat.toBundle());

ActivityB

FragmentB fragment = new FragmentB();
getFragmentManager().beginTransaction()..replace(R.id.fragment_container, fragment, TAG).addToBackStack(TAG).commit();

FragmentB

mView = (ImageView) view.findViewById(R.id.view);
ViewCompat.setTransitionName(mView, "photo);

4 из 5 раз он работает. но когда он не работает, я получаю очень информативную ошибку:

W/OpenGLRenderer﹕ Layer exceeds max. dimensions supported by the GPU (1080x10659, max=4096x4096)
JNI DETECTED ERROR IN APPLICATION: JNI CallVoidMethodV called with pending exception 'java.lang.IllegalStateException' thrown in void android.os.MessageQueue.nativePollOnce(long, int):-2

Вызов Picasso

Picasso.with(context).load(url).centerCrop().resize(width, height).noFade().into(mView);

Немногие вещи, которые могут вызвать это:

  • in FragmentB mView позиция вычисляется динамически с помощью ViewTreeObserver.OnGlobalLayoutListener

  • mView extends ImageView, чтобы создать эффект Оваля в обоих фрагментах.

  • корень ViewGroup является ScrollView

последнее: Theme обоих действий - это дочерний элемент

<style name="Theme" parent="Theme.AppCompat.Light"
    <item name="android:windowContentTransitions">true</item>
    <item name="android:windowAllowEnterTransitionOverlap">true</item>
    <item name="android:windowAllowReturnTransitionOverlap">true</item>
    <item name="android:windowSharedElementEnterTransition">@android:transition/move</item>
    <item name="android:windowSharedElementExitTransition">@android:transition/move</item>
</style>

--- EDIT ---

Подобный вопрос и ответ на мою проблему и еще

Ответ разрешает проблему, но только для API 21. Я использую ActivityCompat.startActivity(...). он поддерживает api 16 и выше , но TransitionListener доступен только с API 19 и поддерживает SceneTransition, поскольку API 21

Также android:transitionGroup="true" требует API 21, поэтому теперь у меня есть 2 основных вопроса:

  • Почему я даже получаю ошибку LayerExceeds max? мой общий View не больше 1080x1080.
  • Как я могу обработать такую ​​ошибку в API < 21, где оба TransitionListener и transitionGroup недоступны?

ERROR stacktrace

JNI DETECTED ERROR IN APPLICATION: JNI CallVoidMethodV called with pending exception 'java.lang.IllegalStateException' thrown in void android.os.MessageQueue.nativePollOnce(long, int):-2
in call to CallVoidMethodV
art/runtime/check_jni.cc:65] from void android.os.MessageQueue.nativePollOnce(long, int)
art/runtime/check_jni.cc:65] "main" prio=5 tid=1 Runnable
art/runtime/check_jni.cc:65]   | group="main" sCount=0 dsCount=0 obj=0x72fb6000 self=0xb4827800
art/runtime/check_jni.cc:65]   | sysTid=6497 nice=0 cgrp=default sched=0/0 handle=0xb6f83bec
art/runtime/check_jni.cc:65]   | state=R schedstat=( 1181860917 459124594 2277 ) utm=100 stm=18 core=2 HZ=100
art/runtime/check_jni.cc:65]   | stack=0xbe27d000-0xbe27f000 stackSize=8MB
art/runtime/check_jni.cc:65]   | held mutexes= "mutator lock"(shared held)
art/runtime/check_jni.cc:65]   native: #00 pc 00004e64  /system/lib/libbacktrace_libc++.so (UnwindCurrent::Unwind(unsigned int, ucontext*)+23)
art/runtime/check_jni.cc:65]   native: #01 pc 00003665  /system/lib/libbacktrace_libc++.so (Backtrace::Unwind(unsigned int, ucontext*)+8)
art/runtime/check_jni.cc:65]   native: #02 pc 00256429  /system/lib/libart.so (art::DumpNativeStack(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, int, char const*, art::mirror::ArtMethod*)+84)
art/runtime/check_jni.cc:65]   native: #03 pc 00238fe7  /system/lib/libart.so (art::Thread::Dump(std::__1::basic_ostream<char, std::__1::char_traits<char> >&) const+158)
art/runtime/check_jni.cc:65]   native: #04 pc 000b191b  /system/lib/libart.so (art::JniAbort(char const*, char const*)+610)
art/runtime/check_jni.cc:65]   native: #05 pc 000b2055  /system/lib/libart.so (art::JniAbortF(char const*, char const*, ...)+68)
art/runtime/check_jni.cc:65]   native: #06 pc 000b530f  /system/lib/libart.so (art::ScopedCheck::ScopedCheck(_JNIEnv*, int, char const*)+1346)
art/runtime/check_jni.cc:65]   native: #07 pc 000bd6f7  /system/lib/libart.so (art::CheckJNI::CallVoidMethodV(_JNIEnv*, _jobject*, _jmethodID*, std::__va_list)+42)
art/runtime/check_jni.cc:65]   native: #08 pc 0006244b  /system/lib/libandroid_runtime.so (???)
art/runtime/check_jni.cc:65]   native: #09 pc 000760c5  /system/lib/libandroid_runtime.so (android::NativeDisplayEventReceiver::dispatchVsync(long long, int, unsigned int)+40)
native: #10 pc 0007628d  /system/lib/libandroid_runtime.so (android::NativeDisplayEventReceiver::handleEvent(int, int, void*)+80)
native: #11 pc 00012545  /system/lib/libutils.so (android::Looper::pollInner(int)+484)
native: #12 pc 000125ed  /system/lib/libutils.so (android::Looper::pollOnce(int, int*, int*, void**)+92)
native: #13 pc 00081709  /system/lib/libandroid_runtime.so (android::NativeMessageQueue::pollOnce(_JNIEnv*, int)+22)
native: #14 pc 000b3863  /data/dalvik-cache/arm/[email protected]@boot.oat (Java_android_os_MessageQueue_nativePollOnce__JI+102)
at android.os.MessageQueue.nativePollOnce(Native method)
at android.os.MessageQueue.next(MessageQueue.java:143)
at android.os.Looper.loop(Looper.java:122)
at android.app.ActivityThread.main(ActivityThread.java:5254)
at java.lang.reflect.Method.invoke!(Native method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
Fatal signal 11 (SIGSEGV), code 1, fault addr 0xfffffff0 in tid 6497 

Ответ 1

принятый ответ к второму вопросу, который вы связали, обсуждает причину этого: предел размера находится во всей целевой системе, на которой выполняется предварительная проверка, а не только перешедший элемент (s). Добавление android:transitionGroup="true" в соответствующее место в переработанном макете приведет к сбою. Вы не разместили свой макет в вопросе, поэтому трудно узнать, куда это будет идти, но если у вас есть ScrollView или другое очень длинное представление, которое было бы хорошим местом для начала.

Для уровней API до 21 это не проблема. AppCompat.startActivity() будет работать на уровнях API ниже 21, но анимация перехода с общим элементом не будет работать. Он вернется к переходу активности по умолчанию.