在开发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文件到目录中
android引入so文件常见问题_第1张图片
然后。。。就是踩坑了。


  • 无法找到so文件
    couldn’t find “libffmpegjni.so
    无法找到so文件的情况下,可以解压打包好的App,在lib目录下看到引入的so资源目录。
    android引入so文件常见问题_第2张图片
    对应

    • 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

android引入so文件常见问题_第3张图片


  • 调用.so文件时报错:libcooee.so: has text relocations
    原因是编译so文件使用的SDK版本低于当前使用的SDK版本,需要在gradle文件中降低当前使用的SDK版本。
    android引入so文件常见问题_第4张图片

小白的作死之旅。。。

更多相关文章

  1. 自定义控件attrs文件里的属性
  2. Android 读取资源文件实例详解
  3. Android通过ContentProvider传输文件
  4. android启动后根文件系统分析
  5. 转:Android下文件操作模式(含SDCard的读写)
  6. Android 文件存储--内部存储的例子
  7. Android之再谈文件操作和SDcard读写
  8. android的文件操作。(未整理完成)
  9. android读取assets大于1M文件的解决方法

随机推荐

  1. SQL基础知识V2——NULL
  2. Redis持久化
  3. 7:VMware Horizon View 8.0-安装Composer服
  4. C语言 Visual studio--报错 2019LINK-
  5. Mysql索引
  6. SQL基础知识V2——VIEW视图
  7. 第16章 0303-门面模式与Composer,(compose
  8. 劝你有时间不妨写写公众号
  9. Linux常用命令
  10. vs设置背景图片