我有几个用户的报告说我的应用程序在大约使用5分钟后崩溃了。我收到了Google Play上的崩溃日志,下面附有一个示例。消息似乎是:
JNI错误(应用程序错误):弱全局引用表溢出(max = 51200)'
我对JNI并不熟悉,并且非常感谢任何关于如何解决这个问题的建议/解释/建议。可能的原因是我的代码中的某些东西没有得到清理,但是什么?
此问题已报告的设备是 Nexus 5.x , Galaxy S7 和 Nexus 6 。
相关代码可以在我的开源项目中找到:https://gitlab.com/hodgskin-callan/Invention。但是,我没有最低限度的代码来重现该问题,并且它不能在我的Nexus 9上重现。我怀疑这个问题并没有影响到大多数Android用户。
*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
Build fingerprint: 'google/bullhead/bullhead:7.1.1/N4F26T/3687331:user/release-keys'
Revision: 'rev_1.0'
ABI: 'arm'
pid: 10404, tid: 10404, name: .x10host.pathos >>> com.x10host.pathos <<<
signal 6 (SIGABRT), code -6 (SI_TKILL), fault addr --------
Abort message: 'art/runtime/indirect_reference_table.cc:132] JNI ERROR (app bug): weak global reference table overflow (max=51200)'
r0 00000000 r1 000028a4 r2 00000006 r3 00000008
r4 f300558c r5 00000006 r6 f3005534 r7 0000010c
r8 00000000 r9 0000000a sl 00001785 fp f0385400
ip 0000000b sp ffde7b50 lr f1a065e7 pc f1a08e44 cpsr 200f0010
backtrace:
#00 pc 00049e44 /system/lib/libc.so (tgkill+12)
#01 pc 000475e3 /system/lib/libc.so (pthread_kill+34)
#02 pc 0001d8a5 /system/lib/libc.so (raise+10)
#03 pc 000193f1 /system/lib/libc.so (__libc_android_abort+34)
#04 pc 00017034 /system/lib/libc.so (abort+4)
#05 pc 0031a5f1 /system/lib/libart.so (_ZN3art7Runtime5AbortEPKc+328)
#06 pc 000b5205 /system/lib/libart.so (_ZN3art10LogMessageD2Ev+1132)
#07 pc 001bc42b /system/lib/libart.so (_ZN3art22IndirectReferenceTable3AddEjPNS_6mirror6ObjectE+194)
#08 pc 0023a097 /system/lib/libart.so (_ZN3art9JavaVMExt16AddWeakGlobalRefEPNS_6ThreadEPNS_6mirror6ObjectE+46)
#09 pc 0027f483 /system/lib/libart.so (_ZN3art3JNI16NewWeakGlobalRefEP7_JNIEnvP8_jobject+418)
#10 pc 0000de14 /data/app/com.x10host.pathos-2/lib/arm/libmonodroid.soapp/com.x10host.pathos-2/lib/arm/libmonodroid.so
答案 0 :(得分:0)
这里有关于这个主题的一篇很长但非常有用的文档:
对于第一次传递,您应尝试通过.txt
文件启用系统属性,该文件将Build Action
设置为$(AndroidEnvironment)
:
即。 debug.mono.log gref
然后,您将从设备中获取adb logcat
,其中将包含此日志记录。
但是,如果这对你不利,那么
您应该可以直接通过以下方式查询:
Java.Interop.JniRuntime.CurrentRuntime.GlobalReferenceCount
Java.Interop.JniRuntime.CurrentRuntime.WeakGlobalReferenceCount
本地引用也在Java.Interop.JniEnvironment.LocalReferenceCount
中跟踪,这是一个线程本地值。