Tencent / MMKV

An efficient, small mobile key-value storage framework developed by WeChat. Works on Android, iOS, macOS, Windows, and POSIX.
Other
17.39k stars 1.91k forks source link

Android 接入1.3.2版本发生崩溃 #1217

Closed mikelhm closed 10 months ago

mikelhm commented 10 months ago

2023-12-29 12:07:36.155 3531-3531 com.android.test A java_vm_ext.cc:579] JNI DETECTED ERROR IN APPLICATION: JNI NewGlobalRef called with pending exception java.lang.NoSuchMethodError: no native method "Lcom/tencent/mmkv/MMKV;.allKeys()[Ljava/lang/String;" java_vm_ext.cc:579] at java.lang.String java.lang.Runtime.nativeLoad(java.lang.String, java.lang.ClassLoader, java.lang.Class) (Runtime.java:-2) java_vm_ext.cc:579] at java.lang.String java.lang.Runtime.nativeLoad(java.lang.String, java.lang.ClassLoader) (Runtime.java:1121) java_vm_ext.cc:579] at void java.lang.Runtime.loadLibrary0(java.lang.ClassLoader, java.lang.Class, java.lang.String) (Runtime.java:1075) java_vm_ext.cc:579] at void java.lang.Runtime.loadLibrary0(java.lang.Class, java.lang.String) (Runtime.java:998) java_vm_ext.cc:579] at void java.lang.System.loadLibrary(java.lang.String) (System.java:1656) java_vm_ext.cc:579] at java.lang.String com.tencent.mmkv.MMKV.doInitialize(java.lang.String, java.lang.String, com.tencent.mmkv.MMKV$LibLoader, com.tencent.mmkv.MMKVLogLevel, boolean) (MMKV.java:223) java_vm_ext.cc:579] at java.lang.String com.tencent.mmkv.MMKV.initialize(android.content.Context, java.lang.String, com.tencent.mmkv.MMKV$LibLoader, com.tencent.mmkv.MMKVLogLevel, com.tencent.mmkv.MMKVHandler) (MMKV.java:205) java_vm_ext.cc:579] at java.lang.String com.tencent.mmkv.MMKV.initialize(android.content.Context, java.lang.String) (MMKV.java:145) java_vm_ext.cc:579] at java.lang.String com.android.test.storage.mmkv.MMKVPreferences$Companion.initialize(android.content.Context) (MMKVPreferences.kt:18) java_vm_ext.cc:579] at java.lang.String com.android.test.storage.mmkv.MMKVPreferences.initialize(android.content.Context) (MMKVPreferences.kt:-1) java_vm_ext.cc:579] at void com.android.test.base.MyApplication.attachBaseContext(android.content.Context) (MyApplication.java:23) java_vm_ext.cc:579] at void com.android.test.base.BaseApplication.attachBaseContext(android.content.Context) (BaseApplication.kt:18) java_vm_ext.cc:579] at void com.android.test.base.Application.attachBaseContext(android.content.Context) (MyApplication.java:285) java_vm_ext.cc:579] at void android.app.Application.attach(android.content.Context) (Application.java:340) java_vm_ext.cc:579] at android.app.Application android.app.Instrumentation.newApplication(java.lang.ClassLoader, java.lang.String, android.content.Context) (Instrumentation.java:1193) java_vm_ext.cc:579] at android.app.Application android.app.LoadedApk.makeApplication(boolean, android.app.Instrumentation) (LoadedApk.java:1393) java_vm_ext.cc:579] at void android.app.ActivityThread.handleBindApplication(android.app.ActivityThread$AppBindData) (ActivityThread.java:7003) java_vm_ext.cc:579] at void android.app.ActivityThread.access$1800(android.app.ActivityThread, android.app.ActivityThread$AppBindData) (ActivityThread.java:254) java_vm_ext.cc:579] at void android.app.ActivityThread$H.handleMessage(android.os.Message) (ActivityThread.java:2184) java_vm_ext.cc:579] at void android.os.Handler.dispatchMessage(android.os.Message) (Handler.java:106) java_vm_ext.cc:579] at boolean android.os.Looper.loopOnce(android.os.Looper, long, int) (Looper.java:233) java_vm_ext.cc:579] at void android.os.Looper.loop() (Looper.java:344) java_vm_ext.cc:579] at void android.app.ActivityThread.main(java.lang.String[]) (ActivityThread.java:8212) java_vm_ext.cc:579] at java.lang.Object java.lang.reflect.Method.invoke(java.lang.Object, java.lang.Object[]) (Method.java:-2) java_vm_ext.cc:579] at void com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run() (RuntimeInit.java:584) java_vm_ext.cc:579] at void com.android.internal.os.ZygoteInit.main(java.lang.String[]) (ZygoteInit.java:1034) java_vm_ext.cc:579] java_vm_ext.cc:579] in call to NewGlobalRef java_vm_ext.cc:579] from java.lang.String java.lang.Runtime.nativeLoad(java.lang.String, java.lang.ClassLoader, java.lang.Class)

lingol commented 10 months ago

Generally, we don't accept issues on UnsatisifiedLinkError. However, your crash info is quite verbose, and here's the crue for you to further investigate. Turn on MMKV's logging if you have turned it off before, and check if it has anything to say about this.

fail to register native methods for class

https://github.com/Tencent/MMKV/blob/master/Android/MMKV/mmkv/src/main/cpp/native-bridge.cpp#L88

lingol commented 10 months ago

By the way, the signature of allKeys() has been changed in v1.3.1. So it's possible that some of your other codes still use older versions of MMKV, and it might cause this error.

mikelhm commented 9 months ago

项目中的确用到了allKeys :val keys = mmkv.allKeys()

allKeys 签名改变?我看mmkv 还有这个接口allKeys(), 如果改变的话,变成什么样子呢

lingol commented 9 months ago

So it's possible that some of your other codes still use older versions of MMKV, and it might cause this error.

What you should do is check if that's the case. If so make them use the same version of MMKV.