项目场景:
项目中使用的 mmkv 版本1.0.23 太老了,并且1.0.23 还引入了 libc++_shared.so 约 249K 左右 + libmmkv.so 约 40 K。
翻查 github 发现最新版本已经到了 1.2.14,并且aar 包体也优化了,所以有了升级需求。
问题描述
在项目中把 mmkv 1.0.23 版本升级到了 1.2.14, 解决完一堆编译错误后(kotlin版本不一致,要求gradle升级等),以为万事大吉,没想到启动时报
Non-fatal Exception: java.lang.UnsatisfiedLinkError: dlopen failed: library "libmmkv.so" not found
网上搜索了各种帖子——无解,后来在 github issue 中 有人提过类似问题 dlopen failed: library "libmmkv.so" not found · Issue #958 · Tencent/MMKV · GitHub
受到了点启发,于是把 源码GitHub - Tencent/MMKV: An efficient, small mobile key-value storage framework developed by WeChat. Works on Android, iOS, macOS, Windows, and POSIX. clone 下来研究下。
原因分析:
源码clone 后编译 mmkv module 发现编译日志里只会生成 以下四种 cpu 架构的 so
armeabi-v7a, arm64-v8a, x86, x86_64
没有生成 armeabi
而我自己的项目只支持 armeabi......
因此原因很明显,和自己项目的 cpu 架构设置有关。
为什么 没有编译生成 armeabi 的 so 呢? 笔者再翻阅了下资料:
ndk17开始不支持armeabi,需要把ndk的版本改为16及以下并且需要把gradle插件降级为4.1.3及以下,但是项目里的 gradle 已经升级到了 7.x 了......
解决方案:
方案1: app 的build.gradle 检查 android-buildTypes 下的ndk abiFilters
ndk { abiFilters "armeabi" }
改为
ndk {
abiFilters "armeabi-v7a"
}
armeabi-v7a 可以向下兼容 armeabi文章来源:https://www.toymoban.com/news/detail-404956.html
方案2: 如果项目有些so 只有 armeabi 架构无法升级到 v7a 的话,可以 通过 mmkv maven 依赖的aar 包找到 armeabi-v7a 的 so, 把 so 放到项目 armeabi 目录,abiFilters 可以依旧是 "armeabi"。文章来源地址https://www.toymoban.com/news/detail-404956.html
到了这里,关于Non-fatal Exception: java.lang.UnsatisfiedLinkError: dlopen failed: library “libmmkv.so“ not found的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!