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 exception 是哪个 exception

Java的Exception和Error面试题10问10答

java的Exception的定义问题

Java中Error和Exception的异同以及运行时异常(Runtime exception)与检查型异常(checked exception)的区别

Java中Error和Exception的异同以及运行时异常(Runtime exception)与检查型异常(checked exception)的区别