Ошибка 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, но анимация перехода с общим элементом не будет работать. Он вернется к переходу активности по умолчанию.