Android 引入第三方so后启动报错 /lib/arm64-v8a, /vendor/lib64, /system/lib64]]] couldn't find "xxx.so"

22 篇文章 0 订阅

缘由:

由于项目需要,引用了不同平台的so文件,分别a.so, b.so ,其中a.so 只有armabi-v7a版本,b.so通过gradle配置自动下载,编译运行后程序启动,运行到需要使用a.so 的地方直接闪退;报错:

java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file xxxxxxxxxxxxxx
  xx.apk!/lib/arm64-v8a, /vendor/lib64, /system/lib64]]] couldn't find "xxx.so"
at java.lang.Runtime.loadLibrary(Runtime.java:367)
	at java.lang.System.loadLibrary(System.java:1076)

分析原因:

从AS中build 一个apk出来 解压查看lib目录 发现里面带有除armabi-v7a目录外 还有其他目录,并且每个目录都有b.so,但是没有a.so文件,再看运行的android 设备 是支持arm64-v8a,根据Android 寻找so的机制,可以得到答案,该Android 设备启动时先到系统目录寻找,没找到,再到软件内部lib找,找到与它适配的目录 arm64-v8a ,继续到目录中寻找用到的a.so、b.so文件,然而除了armabi-v7a目录外其他目录都没有a.so文件,于是系统就抛出这个错误,直接闪退;

通过网上比较多的说法,Android Studio 在打包apk时 会自动把支持的所有so版本复制到apk的lib目录下,由于b.so带有各种版本的so文件 ,打包时把b.so的所有版本随同 arm64-v8a 、x86等目录一并复制到lib中,但是由于a.so 只有armabi-v7a 版本,最终导致其他目录不存在a.so ;

可以得出,这种错误会出现在支持armabi-v7a以外的其他cpu架构中;

解决问题

  1. 条件允许的情况下我们可以选择为a.so生成多个版本的文件,但是这样会导致apk文件增大很多;
  2. 在app下的build.gradle中添加如下配置:(推荐)
android {

...
  ndk {
//只保留armeabi-v7a的目录,具体保留那个根据自己需求
            abiFilters "armeabi-v7a"
        }
    }

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android 中,vendor 分区和 system/product 分区是两个独立的分区,它们有自己的文件系统和权限控制机制。默认情况下,vendor 分区中的应用程序无法访问 system/product 分区中的共享库(so 库)。 如果您需要让 vendor 分区中的应用程序调用 system/product 分区中的共享库,可以通过以下方式来实现: 1. 通过设置 LD_LIBRARY_PATH 环境变量来让应用程序访问 system/product 分区的共享库 在启动应用程序之前,可以通过设置 LD_LIBRARY_PATH 环境变量来让应用程序访问 system/product 分区的共享库。例如: ```java String[] envp = { "LD_LIBRARY_PATH=/system/product/lib64" }; Runtime.getRuntime().exec("app_process /system/bin com.example.MyApp", envp); ``` 这将在启动应用程序时设置 LD_LIBRARY_PATH 环境变量,使得应用程序可以访问 system/product 分区的共享库。需要注意的是,这种方式需要在启动应用程序时设置环境变量,可能会对系统的安全性和稳定性造成一定的影响。 2. 将共享库拷贝到 vendor 分区中 也可以将 system/product 分区中的共享库拷贝到 vendor 分区中,然后在应用程序中直接引用。例如: ```makefile LOCAL_SHARED_LIBRARIES := libfoo LOCAL_LDFLAGS += -L/vendor/lib64 ``` 这将使得应用程序在链接时直接引用 vendor 分区中的 libfoo 库。但是,这种方式需要将共享库拷贝到 vendor 分区中,可能会对系统的安全性和稳定性造成一定的影响。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值