JNI-Fehler bei Szenenübergangsanimation – Layer überschreitet max

Lesezeit: 6 Minuten

Benutzer-Avatar
royB

Bitte beachten Sie die BEARBEITUNG am Ende der Frage

Ich habe 2 Aktivitäten: ActivityA, ActivityB mit zugehörigen Fragmenten: FragmentA, FragmentB beziehungsweise. ImageView v zwischen diesen beiden Fragmenten geteilt wird.

etwas Code: AktivitätA

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

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

AktivitätB

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);

In 4 von 5 Fällen funktioniert es. aber wenn es nicht funktioniert, bekomme ich die Sehr informativ Error:

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

Aufruf Picasso

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

Einige Dinge, die dies verursachen können:

  1. in FragmentB mView Position wird dynamisch berechnet mit ViewTreeObserver.OnGlobalLayoutListener

  2. mView erweitert ImageView um in beiden Fragmenten einen ovalen Effekt zu erzeugen.

  3. die Wurzel ViewGroup ist ein ScrollView

Eine letzte Sache: die Theme beider Aktivitäten ist ein Kind von

<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>

— BEARBEITEN —

Ähnliche Frage und Antwort zu meinem Problem und einem anderen

Antworten lösen das Problem aber nur für API21. Ich benutze ActivityCompat.startActivity(...). es unterstützt API 16 und darüber aber TransitionListener ist erst seit verfügbar API19 und unterstützt SceneTransition seit API21

Ebenfalls android:transitionGroup="true" erfordert API 21 also jetzt habe ich 2 Hauptfragen:

  1. Warum ich überhaupt bekomme LayerExceeds max Error? meine geteilt View ist nicht größer als 1080×1080.
  2. Wie kann ich mit dieser Art von Fehler umgehen? API < 21 wo beides TransitionListener und transitionGroup sind nicht verfügbar?

FEHLER 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 

  • möglicherweise verwandt? stackoverflow.com/questions/26664922/…

    – danb

    30. März 2015 um 3:56 Uhr

  • Das ist eine Warnung, kein Fehler. Wenn Sie der Meinung sind, dass dies zu einem Fehler führt, posten Sie eine vollständigere Protokollausgabe, die früher beginnt und weiterhin zeigt, wie dies zu einer Beendigung oder einem anderen schwerwiegenden Fehler führt.

    – Chris Stratton

    7. April 2015 um 12:38 Uhr

  • Wenn Sie dies auf einem Emulator, einem Nexus-Gerät oder auf Geräten mehrerer Hersteller reproduzieren können, handelt es sich wahrscheinlich um einen Fehler im Android-Betriebssystem. Wenn Sie in diesem Fall ein Projekt veröffentlichen können, das den Fehler reproduziert, bitte ein Problem melden. Ich habe noch nicht mit Aktivitätsübergängen gespielt und habe nicht die leiseste Ahnung, wie ich das umgehen kann, aber ein nativer Absturz von Java-Code bedeutet in den meisten Fällen ein Firmware-Problem. Die einzige Variable ist, ob dies die Schuld eines Herstellers oder von Android selbst ist.

    – CommonsWare

    9. April 2015 um 12:54 Uhr

Benutzer-Avatar
Jarett Millard

Die akzeptierte Antwort auf die zweite Frage, die Sie verlinkt haben, erläutert den Grund dafür: Die Größenbeschränkung gilt für die gesamte vorgerenderte Zielaktivität, nicht nur für die übertragenen Elemente. Hinzufügen android:transitionGroup="true" an die entsprechende Stelle im geänderten Layout wird den Absturz beheben. Sie haben Ihr Layout nicht in der Frage gepostet, daher ist es schwer zu wissen, wohin das führen würde, aber wenn Sie ein haben ScrollView oder eine andere sehr lange Sicht, die ein guter Ausgangspunkt wäre.

Für API-Stufen vor 21 ist dies kein Problem. AppCompat.startActivity() funktioniert auf API-Ebenen unter 21, aber die Übergangsanimation für gemeinsam genutzte Elemente wird nicht ausgeführt. Es wird auf den Standardaktivitätsübergang zurückgegriffen.

1144040cookie-checkJNI-Fehler bei Szenenübergangsanimation – Layer überschreitet max

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy