【问题标题】:JNI Error on Scene Transition Animation - Layer exceeds max场景过渡动画上的 JNI 错误 - 图层超过最大值
【发布时间】:2015-01-04 19:24:25
【问题描述】:

请注意问题底部的 EDIT

我有 2 个活动:ActivityAActivityB 以及相关联的片段:分别为 FragmentAFragmentBImageView v 在这两个片段之间共享。

一些代码:ActivityA

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

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

活动B

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

片段B

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

5 次中有 4 次有效。但是当它不起作用时,我会收到 非常有用 错误:

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

可能导致这种情况的原因很少:

  1. FragmentBmView位置使用ViewTreeObserver.OnGlobalLayoutListener动态计算

  2. mView 扩展ImageView 以便在两个片段中创建椭圆效果。

  3. ViewGroupScrollView

最后一件事:这两个活动的 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>

--- 编辑---

Similar question and answer to my problem and another

Answer 确实可以解决问题,但仅适用于 API 21。我正在使用ActivityCompat.startActivity(...)。它支持 api 16 及更高版本 TransitionListener 仅在 API 19 之后可用,并且从 API 21 开始支持 SceneTransition em>

另外android:transitionGroup="true" 需要API 21 所以现在我有2 个主要问题:

  1. 为什么我什至收到LayerExceeds max 错误?我共享的View 不大于 1080x1080。
  2. TransitionListenertransitionGroup 均不可用的API 上,我该如何处理这种错误?

错误堆栈跟踪

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/system@framework@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 

【问题讨论】:

  • 这是一个警告,而不是错误。如果您认为会导致错误,请从更早开始发布更完整的日志输出,并继续说明这会如何导致终止或其他严重故障。
  • 如果您能够在模拟器、Nexus 设备或多个制造商的设备上重现此问题,则它可能代表 Android 操作系统错误。在这种情况下,如果您可以发布一个重现错误的项目,请file an issue。我还没有玩过活动转换,也没有关于如何解决它的最模糊的概念,但是在大多数情况下,Java 代码的本机崩溃意味着固件问题。唯一的变量是这是某些制造商的错还是Android本身的错。

标签: android android-animation picasso


【解决方案1】:

您链接的第二个问题的accepted answer 讨论了发生这种情况的原因:大小限制是针对整个预呈现的目标活动,而不仅仅是过渡的元素。将android:transitionGroup="true" 添加到过渡布局中的适当位置将修复崩溃。您没有在问题中发布您的布局,因此很难知道它会去哪里,但如果您有 ScrollView 或其他非常长的视图,那将是一个不错的起点。

对于 21 之前的 API 级别,这不是问题。 AppCompat.startActivity() 将在低于 21 的 API 级别上工作,但共享元素过渡动画将不会运行。它将回退到默认的活动转换。

【讨论】:

    猜你喜欢
    • 2016-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-04
    • 1970-01-01
    相关资源
    最近更新 更多