27
2017
09

android引入so文件常见问题

在开发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版本。
    这里写图片描述

小白的作死之旅。。。

上一篇:一 activity 面试详解 下一篇:String对象具备的一些基本方法