android native层动态加载so动态库

        最近接手一个android app开发,需要集成一些外部so动态库,因为有好几个动态库,还存在动态库里动态加载其它动态库的情况,所以在java代码里直接使用System.loadLibrary的方式不完全适用,得走c代码里dlopen的方式进行。但是这样也带来一个问题,就是app安装后如何定位so库的路径,如果定位不到路径就没法动态加载了。

        网上看了很多资料,都说可以通过ApplicationInfo.nativeLibraryDir属性获取app安装后的so库路径,但是实际上这个属性的值取决于AndroidManifest.xml中配置的extractNativeLibs值,如果配置为false则nativeLibraryDir获取到的是空值,而且从AGP 3.6.0版本以后如果在AndroidManifest.xml中没有显式配置extractNativeLibs值为true的话则默认就是false的,实际上大部分项目也是不会配置这个属性,所以大概率很多app是没办法根据nativeLibraryDir来获取实际的so库安装路径了。这条路走不通只能继续研究,后面看到一些介绍app热更新的文章,提到说热更新时先下载so库到公共存储,然后再拷贝回app私有存储进行dlopen加载。受此启发,想到也许app安装时初始化的时候也可以这么干,android app项目有个assets目录是用来放静态资源的,打包时会打包进apk而且app运行时可以访问这些资源,于是就这么干:

1.把so动态库放assets目录里一起打包进apk

2.app启动运行时检测私有存储是否存在需要的so库,如果没有则从assets中拷贝so库到私有存储。可以通过Context.getAssets().open("so库在assets下的路径")打开文件读取流进行读取

3.获取到app私有存储下的so库路径,就可以用dlopen愉快地动态加载啦

        以上方式亲测有效,对性能似乎也看不出有什么影响。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值