Android Studio上打的包在arm64位机器上找不到对应的so库
来源:互联网 发布:娱乐圈爆料知乎 编辑:程序博客网 时间:2024/05/22 10:51
现象描述
Android Studio打出来的包在64位机器上报以下
java.lang.UnsatisfiedLinkError: dlopen failed: “libfoobar.so”
我们是在工程目录中将32位的so库拷贝到arm64-v8a中的
原因分析
apk包在安装的时候,系统会把包中与自己的abi对应的lib目录中的so库文件拷贝到system分区中,32位机器中只有一个目录/system/lib,64位机器中有两个目录/system/lib和/system/lib64,app启动进行链接时,64位机器中会先到/system/lib64目录中去找,如果没有找到再到/system/lib目录中去找。如果你把32位的so库拷贝到了lib64目录中,会导致链接失败,同样,64位的so库被拷贝到lib目录中也会导致失败,所以so库要和目录一一对应。
如果我们的工程的so库目录中没有arm64目录,默认情况下,Android Studio会在apk中自动创建一个空的arm64-v8a文件夹,并根据一些规则把某些so库(具体是怎样的规则,我也不知道)拷贝到这个目录中,这样就导致,在64位机器上在lib64目录下找到的so库并不是正确的so库文件,从而出现了上面的错误
解决办法
解决办法就是阻止Android Studio自动的生成arm64-v8a目录,我们自己写脚本把对应的so库文件拷贝到build对应的目录下
在build.gradle中写入如下的脚本
sourceSets.main { jni.srcDirs = [] } tasks.withType(JavaCompile) { compileTask -> compileTask.dependsOn ndkLibsToJar } task ndkLibsToJar(type: Zip, description: 'Create a JAR of the native libs') { destinationDir new File(buildDir, 'libs') baseName 'ndk-libs' extension 'jar' from(new File(buildDir, 'libs')) { include '**/*.so' } into 'lib/' }
同时,我们把工程目录中的对应的arm64-v8a目录删掉,大功告成
0 0
- Android Studio上打的包在arm64位机器上找不到对应的so库
- Android Studio上打的包在arm64位机器上找不到对应的so库
- android studio 64位手机+Fresco引起的在arm64位机器上找不到对应的so库
- Fresco引起的在arm64位机器上找不到对应的so库
- Android集成Fresco框架导致在64位机器上(三星S6,华为P8等)找不到其他so库
- 在32位的机器上编译Android
- 运行android studio 在模拟器上找不到自己做的app
- android找不到so包
- Android studio 集成ndk环境,生成so库,并在其他项目上引用
- 在X86上交叉编译ARM64 linux上的NCNN
- android studio so 文件找不到的偏
- 在win 64位机器上 编译Tcl扩展库 工具 vs2008 、64位的Tcl
- 怎么在64位linux机器上编译32位的openssl库
- 关于Android Studio导入第三方.so库,找不到so库以及找不到so库中方法的问题
- Android studio so库找不到问题
- Android so文件是32位时,如何在64位手机上运行。
- cocos2dx3.0以下版本打的apk包在android5.0机上运行崩溃
- linux打的war包在linux上无法运行(一个奇葩事件,spring无法读取Properties)
- 使用Xutils 框架 下载功能进度条无法更新
- 【瞎扯】在一个创业项目组干开发是一种什么样的体验?
- Practice in program
- IOS教程
- 文章标题
- Android Studio上打的包在arm64位机器上找不到对应的so库
- javadoc标记
- SurfaceView 基础用法
- cocos2d-x 3.0 整合 cocostuidio
- C++ 实参和形参
- RPM详解
- 《少的力量》笔记
- 菜鸟教程之工具使用(十七)——7款开源Java反编译工具(转)
- hdu1075字典树解法