java.lang.StackOverflow Android L预览运行艺术的错误

时间:2014-10-15 14:52:06

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

直接跳到主题,Android L引入了ART作为默认运行时。我有一个示例应用程序,基本上是一个文档查看器大多数文档查看代码(包括后退按钮,搜索等)都是用C语言编写的,Android App使用的是JNI接口。我更新了我的代码,使其为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

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

更新:我暂时禁用了对本机代码调用JNI的File Close函数的调用,现在我似乎没有看到任何崩溃。

1 个答案:

答案 0 :(得分:1)

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

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

adb shell setprop debug.checkjni 1

设置为其他值或重启设备会将其关闭。