android - java.lang.StackOverflow Error for Android L预览跑图

标签 android java-native-interface android-5.0-lollipop art-runtime android-runtime

直奔主题,Android L 引入了 ART 作为默认运行时。我有一个示例应用程序,基本上是一个文档查看器。大多数文档查看代码包括后退按钮、搜索等都是用 C 编写的,Android 应用程序使用 JNI 接口(interface)。我更新了我的代码,让它为 Android L 构建,它似乎可以很好地打开文档。但是,当按下后退按钮并关闭文档时,应用程序似乎崩溃了,并且可以看到以下回溯:

I/DEBUG   ( 1390): Abort message: 'art/runtime/check_jni.cc:65] JNI DETECTED ERROR IN APPLICATION: JNI CallIntMethodV called with pending exception 'java.lang.StackOverflowError' thrown in unknown throw location'
I/DEBUG   ( 1390): backtrace:
I/DEBUG   ( 1390):     #00 pc 000390d0  /system/lib/libc.so (tgkill+12)
I/DEBUG   ( 1390):     #01 pc 0001636d  /system/lib/libc.so (pthread_kill+64)
I/DEBUG   ( 1390):     #02 pc 00016e41  /system/lib/libc.so (raise+10)
I/DEBUG   ( 1390):     #03 pc 00013cdd  /system/lib/libc.so (__libc_android_abort+36)
I/DEBUG   ( 1390):     #04 pc 000125ac  /system/lib/libc.so (abort+4)
I/DEBUG   ( 1390):     #05 pc 00230fe9  /system/lib/libart.so (art::Runtime::Abort()+188)
I/DEBUG   ( 1390):     #06 pc 000b9571  /system/lib/libart.so     (art::LogMessage::~LogMessage()+1360)
I/DEBUG   ( 1390):     #07 pc 000c28cd  /system/lib/libart.so (art::JniAbort(char const*, char const*)+1124)
I/DEBUG   ( 1390):     #08 pc 000c2e11  /system/lib/libart.so (art::JniAbortF(char const*, char const*, ...)+68)
I/DEBUG   ( 1390):     #09 pc 000c65e9  /system/lib/libart.so (art::ScopedCheck::ScopedCheck(_JNIEnv*, int, char const*)+1952)
I/DEBUG   ( 1390):     #10 pc 000cc8eb  /system/lib/libart.so (art::CheckJNI::CallIntMethodV(_JNIEnv*, _jobject*, _jmethodID*, std::__va_list)+42)

按下后退按钮,当文件描述符应该关闭时,调用 CallIntMethodV,最终无法检查 JNI。相同的代码似乎在 dalvik 上工作得很好。我必须添加以下标志才能使 JNI 代码在 Android L 预览版中正常编译:

-Wno-switch -Wno-sizeof-pointer-memaccess
LOCAL_DISABLE_FORMAT_STRING_CHECKS := true

关键是为什么它现在开始在 art 上失败,而不是在 dalvik 上。 CallIntMethodV 中的任何特定更改导致问题或编译器严格性导致出现此类错误?任何指针。如果需要,我很乐意提供更多详细信息。

更新:我暂时禁用了对 native 代码调用 JNI 的文件关闭函数的调用,现在我似乎没有看到任何崩溃。

最佳答案

我希望这个问题与引用问题有关——保留一个本地引用并在不同的线程或类似的东西上使用它。我不确定“ native 代码调用 JNI 以关闭文件”是什么意思,但也许您正在将需要刷新/释放的结构从 JNI 传回 Java(以便 VM 从c 结构返回到 VM)。

显然 ART 有一些比 Dalvik 更严格的 jni 检查。 Android site 上有一些细节和进一步 this page告诉我们如何调试它们。您可以像这样使用 adb 在真实设备上检查它:

adb shell setprop debug.checkjni 1

设置为另一个值或重新启动设备将关闭它。

关于android - java.lang.StackOverflow Error for Android L预览跑图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26385578/

相关文章:

android - 在 Android 的 Fragment Java 中获取选项卡的文本/标题

Android NDK open() 设备权限被拒绝

java - 如何从 JNI 返回枚举

android - 在 JNI 中使用像素数据创建新的位图?

android - 在 Android 操作系统中将 JPEG/PNG 图像转换为 TIFF 图像格式

Android xml CSS 类似布局边距

Android ActivityOptions.makeSceneTransitionAnimation 似乎不存在

android - MapFragment 或 MapView getMap() 在 Lollipop 上返回 null

Android 5.0 Lollipop UsbDevice 缺少接口(interface)

java - Android 如何在 Fragmentclass 中使用 javaclass.this