Android关于libs,jniLibs库的基本使用说明及冲突解决
2017-10-13 18:08
465 查看
最近在开发中遇到了一个问题,因为项目需要集成不同的sdk。相对应的也是不同的.so文件。
针对libs中.so库的引入会遇到一些问题。
比如要集成第三方NDK库:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202003/31/984457f7e0da680b16ebd32173788730)
如果是在eclipse中,需要放到libs下对应库的目录。
如果是在Android Studio中,则会默认匹配main下的jniLibs目录,如果没有目录需要自己手动创建。并且库的名称也不能随便更改。
但是这里会有一个问题,就是如果使用的是AndroidStudio,但是想用libs下的库,还需要手动去指定库的位置:
在App下的build.gradle中加入以下配置。
在集成第三方服务商sdk的时候,大多数都会让你下载demo,或者是SDK集合包,让你直接拷贝整个libs或者jniLibs目录,合并本地项目。这样就会出问题。
以讯飞语音开发文档、百度语音开发文档和极光推送文档为例
讯飞的文档中说明是将libs目录下所有的文件拷贝至自己项目中的libs目录。
![](https://oscdn.geek-share.com/Uploads/Images/Content/202003/31/36197a49656062c9b5595133fd068e63)
百度的则是将app/src/main/jniLibs下的所有文件拷贝至自己的项目。
![](https://oscdn.geek-share.com/Uploads/Images/Content/202003/31/cc212bf9949a34c51d080d20866a0ce4)
极光文档就显得比较人性化
![](https://oscdn.geek-share.com/Uploads/Images/Content/202003/31/bd8f62bed8784bbfad00110a0c6e649c)
如果你要集成前面两家的sdk,显然就会出现冲突。
build配置后,jniLibs库就无法被识别。但是不配置的话,libs库无法识别。
结果是改来改去总有一方库无法加载.so文件。
所以要解决的话,就抛弃前面的文档吧。
正确姿势是把所有的.so所对应的库要么全部放在libs,要么全部放在jniLibs。
eclipse现在的使用者已经很少了,所以还是以Android Studio为主。建议全部放在jniLibs,不需要额外的任何配置。
说点题外话
在第三方提供的NDK库中,大多都是成套的为了适配不同的cpu厂商,也就是常说的高通,联发科这些。
在拷贝库的时候也会成套的拷贝进项目,一般是四五个,百度语音的.so库全部导入的话加起来足足在15M以上。
所以在选择第三方服务的时候这也是需要考虑的一个因素。
以
我的demo为例,最近公司要选择一套语音方案,所以暂时就体验了百度的和讯飞的。
集成之前安装包是4M,集成后21M。
![](https://oscdn.geek-share.com/Uploads/Images/Content/202003/31/1a3ba881a0cfb7ee30660892fdcb1a2f)
如果要精简通过so库来减少安装包的大小其实还可以通过动态选择需要添加的.so库
在App下的build.gradle中配置:
这样就可以指定加载库。
相关文档参考:
ANDROID动态加载 使用SO库时要注意的一些问题
Android jniLibs下目录详解(.so文件)
项目demo参考:
android-CollectionDemo
针对libs中.so库的引入会遇到一些问题。
比如要集成第三方NDK库:
如果是在eclipse中,需要放到libs下对应库的目录。
如果是在Android Studio中,则会默认匹配main下的jniLibs目录,如果没有目录需要自己手动创建。并且库的名称也不能随便更改。
但是这里会有一个问题,就是如果使用的是AndroidStudio,但是想用libs下的库,还需要手动去指定库的位置:
在App下的build.gradle中加入以下配置。
android { ...... sourceSets { main { jniLibs.srcDirs = ['libs'] ...... } ...... } ...... }
在集成第三方服务商sdk的时候,大多数都会让你下载demo,或者是SDK集合包,让你直接拷贝整个libs或者jniLibs目录,合并本地项目。这样就会出问题。
以讯飞语音开发文档、百度语音开发文档和极光推送文档为例
讯飞的文档中说明是将libs目录下所有的文件拷贝至自己项目中的libs目录。
百度的则是将app/src/main/jniLibs下的所有文件拷贝至自己的项目。
极光文档就显得比较人性化
如果你要集成前面两家的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' }
这样就可以指定加载库。
相关文档参考:
ANDROID动态加载 使用SO库时要注意的一些问题
Android jniLibs下目录详解(.so文件)
项目demo参考:
android-CollectionDemo
相关文章推荐
- 关于Android使用JNI报错 java.lang.UnsatisfiedLinkError: dlopen failed: 和xxx.so: has text relocations错误问题的解决
- 关于Android高德地图4.12无法显示地图只显示Logo问题,非只添加 jniLibs.srcDirs = ['libs']就解决的
- 关于android 使用Scoket通信中文乱码问题的解决
- 举例说明关于Android中SharedPreferences的使用方法
- Android动画---如何正确使用平移动画(关于fillBefore和fillAfter的一点说明)(转载)
- 举例说明关于android编程中遇到的java.lang.ClassCastException: android.app.Application问题的原因及解决办法
- 在Android JNI环境下使用C++的几个问题与解决
- Android JNI入门第五篇——基本数据类型使用
- Unity3d关于使用android相关功能和外链包??解决办法!!
- Android 关于汉字转拼音的工具类Pinyin4jUtil 的使用说明
- 举例说明android编程中遇到的关于android.view.InflateException错误的原因及解决办法
- 关于 Android 程序使用 Support Library 属性的几点说明
- 关于使用NotificationComat导致android2.3及以下版本无法显示自定义布局的解决方法.
- 【Android】Android import和export使用说明 及 export报错:jarlist.cache: Resource is out of sync with the file syst解决
- Android_关于使用android_r21 出现swt.jar的错误解决方法
- Android JNI入门第五篇——基本数据类型使用
- android中opengl es基本方法使用说明
- [转载+实践理解]Android动画---如何正确使用平移动画(关于fillBefore和fillAfter的一点说明)(转载)
- 关于Android JNI 编程如何定位段错误的问题(addr2line的使用)
- Android 关于百度地图Android SDK几处修正使用说明(非官方) 推荐