Android关于libs,jniLibs库的基本使用说明及冲突解决

最近在开发中遇到了一个问题,由于项目须要集成不一样的sdk。相对应的也是不一样的.so文件。android

针对libs中.so库的引入会遇到一些问题。app

好比要集成第三方NDK库:eclipse

若是是在eclipse中,须要放到libs下对应库的目录。 
若是是在Android Studio中,则会默认匹配main下的jniLibs目录,若是没有目录须要本身手动建立。而且库的名称也不能随便更改。gradle

可是这里会有一个问题,就是若是使用的是AndroidStudio,可是想用libs下的库,还须要手动去指定库的位置:ui

在App下的build.gradle中加入如下配置。.net

   android {
        ......
        sourceSets {
            main {
                jniLibs.srcDirs = ['libs']
                ......
            }
            ......
        }
        ......
    }
1
2
3
4
5
6
7
8
9
10
11
在集成第三方服务商sdk的时候,大多数都会让你下载demo,或者是SDK集合包,让你直接拷贝整个libs或者jniLibs目录,合并本地项目。这样就会出问题。blog

以讯飞语音开发文档、百度语音开发文档和极光推送文档为例ip

讯飞的文档中说明是将libs目录下全部的文件拷贝至本身项目中的libs目录。开发

百度的则是将app/src/main/jniLibs下的全部文件拷贝至本身的项目。v8

极光文档就显得比较人性化

若是你要集成前面两家的sdk,显然就会出现冲突。

build配置后,jniLibs库就没法被识别。可是不配置的话,libs库没法识别。 
结果是改来改去总有一方库没法加载.so文件。

因此要解决的话,就抛弃前面的文档吧。 
正确姿式是把全部的.so所对应的库要么所有放在libs,要么所有放在jniLibs。 
eclipse如今的使用者已经不多了,因此仍是以Android Studio为主。建议所有放在jniLibs,不须要额外的任何配置。

说点题外话

在第三方提供的NDK库中,大多都是成套的为了适配不一样的cpu厂商,也就是常说的高通,联发科这些。

在拷贝库的时候也会成套的拷贝进项目,通常是四五个,百度语音的.so库所有导入的话加起来足足在15M以上。

因此在选择第三方服务的时候这也是须要考虑的一个因素。 
以 
个人demo为例,最近公司要选择一套语音方案,因此暂时就体验了百度的和讯飞的。 
集成以前安装包是4M,集成后21M。

若是要精简经过so库来减小安装包的大小其实还能够经过动态选择须要添加的.so库

在App下的build.gradle中配置:

ndk {
            //选择要添加的对应cpu类型的.so库。
            abiFilters 'armeabi', 'armeabi-v7a', 'arm64-v8a'
            // 还能够添加 'x86', 'x86_64', 'mips', 'mips64'
        }
1
2
3
4
5
6
这样就能够指定加载库。

相关文档参考:  ANDROID动态加载 使用SO库时要注意的一些问题  Android jniLibs下目录详解(.so文件)

相关文章
相关标签/搜索