动态加载so文件

Posted Sun‘刺眼的博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动态加载so文件相关的知识,希望对你有一定的参考价值。

在开发过程中,经常会用到第三方库,比如地图、视频、文档编辑、图表之类。依赖这些库,需要添加其SDK,有时需要用到jni层的So文件,比如百度地图等。

 

那么问题来了,如果两个不同的库之间的so文件发生冲突这么办?

 

比如:单独添加地图的库,运行没有问题。单独添加一个视频库,运行没有问题。但两者同时添加,其中一个库在init的时候报错。这当然和第三方库的开发水平有很大关系,但我们怎么解决这个问题呢?这就用到动态加载的方法。

 

这是原先的静态加载方法,将所有依赖库的so文件全部一股脑的放进armeabi文件夹即可。

 

动态加载的方法,我将冲突的so文件放在assets文件夹中

 

这里需要注意的是:动态加载so的文件只能放在两个地方:1. lib文件夹中,即对应android Studio中的jniLibs文件夹。2. 本地data/data/package数据目录下。 所以,当应用第一次启动的时候,必须将我们放在assets文件夹中的so文件拷贝乳本地数据目录下。

 

 

技术分享

 

当然,上面这个方法是将so文件放在程序的assets文件夹。另一种方法是:也可以从网络上下载,放入本地数据目录下。这样的好处是不仅减小的了apk的大小,而且可以随时使用最新的依赖库,这也是动态加载的最多得用途之一。

以上是关于动态加载so文件的主要内容,如果未能解决你的问题,请参考以下文章

在 Windows 上用 C# 加载 linux 动态库 (.so)

无法加载动态库“libcupti.so.11.0”; dlerror: libcupti.so.11.0: 无法打开共享对象文件

无法加载动态库“libcublasLt.so.11”; dlerror:libcublasLt.so.11:无法打开共享对象文件:没有这样的文件或目录

无法加载动态库“libcublas.so.10”; dlerror:libcublas.so.10:无法打开共享对象文件:没有这样的文件或目录;

golang编译so动态库加载失败

Android 逆向Android 进程注入工具开发 ( 远程进程注入动态库文件操作 | 注入动态库 加载 业务动态库 | 业务动态库启动 | pthread_create 线程开发 )