Non-fatal Exception: java.lang.UnsatisfiedLinkError: dlopen failed: library “libmmkv.so“ not found
Posted 我不勤奋v
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Non-fatal Exception: java.lang.UnsatisfiedLinkError: dlopen failed: library “libmmkv.so“ not found相关的知识,希望对你有一定的参考价值。
项目场景:
项目中使用的 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
方案2: 如果项目有些so 只有 armeabi 架构无法升级到 v7a 的话,可以 通过 mmkv maven 依赖的aar 包找到 armeabi-v7a 的 so, 把 so 放到项目 armeabi 目录,abiFilters 可以依旧是 "armeabi"。
以上是关于Non-fatal Exception: java.lang.UnsatisfiedLinkError: dlopen failed: library “libmmkv.so“ not found的主要内容,如果未能解决你的问题,请参考以下文章
spring-boot启动debug信息中non-fatal error解决
Java中Error和Exception的异同以及运行时异常(Runtime exception)与检查型异常(checked exception)的区别
Java中Error和Exception的异同以及运行时异常(Runtime exception)与检查型异常(checked exception)的区别