如何解决红米4设备上Unity游戏的JNI崩溃错误?
问题背景
我正在红米4(Android版本7.1.2 N2G47H,MIUI版本9.1)上测试Unity游戏,游戏进程com.BitwiseVentures.TeenPattiRoyale出现崩溃,崩溃日志如下:
*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** Build fingerprint: 'xiaomi/mido/mido:7.0/NRD90M/V9.0.5.0.NCFMIEI:user/release-keys' Revision: '0' ABI: 'arm' pid: 21527, tid: 24307, name: Thread-79 >>> com.BitwiseVentures.TeenPattiRoyale <<< signal 6 (SIGABRT), code -6 (SI_TKILL), fault addr -------- Abort message: 'art/runtime/indirect_reference_table.cc:66] JNI ERROR (app bug): see above.' r0 00000000 r1 00005ef3 r2 00000006 r3 00000008 r4 cd600978 r5 00000006 r6 cd600920 r7 0000010c r8 e6a6e800 r9 f382eacf sl f384b07e fp 00000000 ip 0000000b sp cd5ff990 lr f55df2b7 pc f55e1b38 cpsr 200f0010 backtrace: #00 pc 00049b38 /system/lib/libc.so (tgkill+12) #01 pc 000472b3 /system/lib/libc.so (pthread_kill+34) #02 pc 0001d555 /system/lib/libc.so (raise+10) #03 pc 000190a1 /system/lib/libc.so (__libc_android_abort+34) #04 pc 00017104 /system/lib/libc.so (abort+4) #05 pc 00319f31 /system/lib/libart.so (_ZN3art7Runtime5AbortEv+252) #06 pc 000b4ef9 /system/lib/libart.so (_ZN3art10LogMessageD2Ev+864) #07 pc 001bad69 /system/lib/libart.so (_ZN3art22IndirectReferenceTable17AbortIfNoCheckJNIEv+84) #08 pc 0023bceb /system/lib/libart.so (_ZNK3art22IndirectReferenceTable10GetCheckedEPv+498) #09 pc 00334309 /system/lib/libart.so (_ZNK3art6Thread13DecodeJObjectEP8_jobject+44) #10 pc 00315be9 /system/lib/libart.so (_ZN3art8ArgArray24BuildArgArrayFromJValuesERKNS_33ScopedObjectAccessAlreadyRunnableEPNS_6mirror6ObjectEP6jvalue+160) #11 pc 00315a53 /system/lib/libart.so (_ZN3art17InvokeWithJValuesERKNS_33ScopedObjectAccessAlreadyRunnableEP8_jobjectP10_jmethodIDP6jvalue+250) #12 pc 00272057 /system/lib/libart.so (_ZN3art3JNI23CallStaticObjectMethodAEP7_JNIEnvP7_jclassP10_jmethodIDP6jvalue+426) #13 pc 00a471d8 /data/app/com.BitwiseVentures.TeenPattiRoyale-2/lib/arm/libunity.so #14 pc 00005c4c <anonymous:cbe0f000>
可能的解决思路
结合日志里的JNI ERROR (app bug)和间接引用表异常信息,这通常和JNI引用管理、线程调用或者版本兼容有关,给你几个具体的排查和修复方向:
- 检查JNI引用的生命周期管理:如果你的游戏或第三方插件有自定义JNI代码,要确保局部引用及时调用
DeleteLocalRef释放,避免间接引用表溢出。Unity在调用Java对象时也会生成局部引用,大量重复创建未释放的话会触发这个错误。 - 升级Unity到稳定LTS版本:旧版本Unity对Android 7.x的ART虚拟机兼容性可能存在问题,建议升级到2019.x或更高的长期支持版本,同时在Build Settings里确认Android的API Level配置和目标设备匹配。
- 适配MIUI系统特性:MIUI的内存管控和ART虚拟机有特殊处理,你可以尝试:
- 在
AndroidManifest.xml中添加android:largeHeap="true"来增加应用可用内存; - 关闭MIUI对游戏的后台限制(设置→应用管理→找到游戏→权限管理→开启后台弹出界面、自启动等权限);
- 调整Unity的Player Settings里的内存相关选项,比如降低图形内存占用。
- 在
- 排查第三方插件/SDK:崩溃发生在
libunity.so调用JNI的环节,很可能是第三方插件的JNI代码有问题。尝试逐个禁用插件,测试游戏是否还崩溃,定位出问题插件后联系开发者修复,或者替换为兼容的版本。 - 检查线程调用安全性:崩溃线程是
Thread-79(非主线程),在非主线程调用JNI方法时,要确保正确附着到Android虚拟机。Unity中如果在后台线程调用AndroidJavaClass或AndroidJavaObject,要注意线程上下文,必要时使用UnityMainThreadDispatcher等工具将JNI调用切换到主线程执行。
内容的提问来源于stack exchange,提问作者Neel Gajjar




