您的位置:首页 > 移动开发 > Android开发

android引入so文件常见问题

2017-09-27 10:50 369 查看
在开发android程序时,由于要使用到so文件,无奈自己引入,做个简单总结。

使用so文件,配置so文件的source目录

在gradle(Module:app)中配置

android {
compileSdkVersion 25
buildToolsVersion "25.0.2"
defaultConfig {
...
ndk{
abiFilters "armeabi-v7a"
}
}
buildTypes {
release {
...
}
}
sourceSets {
main {
jniLibs.srcDir 'libs'
}
}
}


然后加入需要的so文件到目录中



然后。。。就是踩坑了。

无法找到so文件

couldn’t find “libffmpegjni.so

无法找到so文件的情况下,可以解压打包好的App,在lib目录下看到引入的so资源目录。



对应

armeabiv-v7a: 第7代及以上的 ARM 处理器。2011年15月以后的生产的大部分Android设备都使用它.

arm64-v8a: 第8代、64位ARM处理器,很少设备,三星 Galaxy S6是其中之一。

armeabi: 第5代、第6代的ARM处理器,早期的手机用的比较多。

x86: 平板、模拟器用得比较多。

x86_64: 64位的平板。

并且在每个目录下的so文件数量大多都不一样,而在不同的处理器上,查找so文件的顺序不同(例如64位处理器会优先查找arm64-v8a),这也就引起了系统在加载so文件时找不到so文件夹。

解决方案:

方案1:保证每个目录下都有自己所需要的so文件。

方案2:在牺牲效率的前提下,只保留armeabi文件夹,因为即使是64位的处理器也可以运行32位的库。

对于方案2,在gradle中加入如下配置,就可以看到打包后的lib目录只剩一个了。这样处理器就会去自动加载这个目录下的so文件。

defaultConfig {
...
//配置只加载armeabi下的so文件
abiFiltersndk {
abiFilters "armeabi"
}
}


如果还是不行,再gradle.properties中加入:android.useDeprecatedNdk=true



调用.so文件时报错:libcooee.so: has text relocations

原因是编译so文件使用的SDK版本低于当前使用的SDK版本,需要在gradle文件中降低当前使用的SDK版本。



小白的作死之旅。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android so gradle