java.lang.StackOverflow Error for Android L preview running art

 2023-01-21    276  

问题描述

直接跳到主题,Android L引入了ART作为默认运行时.我有一个示例应用程序,基本上是文档查看器.大多数文档查看代码在内的代码,包括背按钮,搜索等,用C编写,Android应用程序使用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,最终将失败.同样的代码似乎在Dalvik上正常工作.我不得不添加以下标志以使JNI代码适合Android L Preview:

java.lang.StackOverflow Error for Android L preview running art

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

关键点是为什么现在开始在艺术上失败,而不是在Dalvik上失败.引起问题或编译器严格性引起的CallIntMethodv有任何具体变化导致这种错误引起吗?任何指针.如果需要,我很乐意提供其他详细信息.

更新:我暂时禁用了本机代码调用JNI的呼叫呼叫,我现在似乎没有看到任何崩溃.

推荐答案

我希望这个问题与参考文献的问题有关 – 将本地参考保留并在其他线程或类似的内容上使用.我不确定您的意思是”本机代码呼叫JNI关闭文件”,但也许您将结构传递给JNI的JAVA需要刷新/释放(以便VM复制来自该数据的数据C结构回到VM).

显然,艺术比达维克(Dalvik)进行了一些更严格的JNI检查. android site and href 此页面.您可以使用这样的ADB在真实设备上打开检查:

adb shell setprop debug.checkjni 1

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

以上所述是小编给大家介绍的java.lang.StackOverflow Error for Android L preview running art,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对77isp云服务器技术网的支持!

原文链接:https://77isp.com/post/26228.html

=========================================

https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。