android studio 以及SO的关系
来源:互联网 发布:7u分享网络官网 编辑:程序博客网 时间:2024/06/08 06:03
相信很多朋友在使用Android studio开发中,遇到过如何引入第三方so文件的问题,然而第三方官方仅仅给出了ADT环境下的集成方式。
Android studio中默认使用的是gradle编译方式,与ADT编辑方式不一样,那么so文件应当如何引入呢?
其实很简单。这里以集成JPUSH为例,看一下so文件如何引入到编译环境,最终到JNI直接可以调用该so文件。
首先,在我们的Module的根目录中建立libs目录,将jpush集成SDK中的so文件分别拷入,截图如下:
不确定为什么一定是JNI调用的才会有关系???
关于Android的.so文件你所需要知道的
http://www.open-open.com/lib/view/open1440421271716.htmlApp中可能出错的地方
处理.so文件时有一条简单却并不知名的重要法则。
你应该尽可能的提供专为每个ABI优化过的.so文件,但要么全部支持,要么都不支持:你不应该混合着使用。你应该为每个ABI目录提供对应的.so文件。
当一个应用安装在设备上,只有该设备支持的CPU架构对应的.so文件会被安装。在x86设备上,libs/x86目录中如果存在.so文件的 话,会被安装,如果不存在,则会选择armeabi-v7a中的.so文件,如果也不存在,则选择armeabi目录中的.so文件(因为x86设备也支 持armeabi-v7a和armeabi)。
其他地方也可能出错
当你引入一个.so文件时,不止影响到CPU架构。我从其他开发者那里可以看到一系列常见的错误,其中最多的是"UnsatisfiedLinkError","dlopen: failed"以及其他类型的crash或者低下的性能:
使用android-21平台版本编译的.so文件运行在android-15的设备上
使用NDK时,你可能会倾向于使用最新的编译平台,但事实上这是错误的,因为NDK平台不是后向兼容的,而是前向兼容的。推荐使用app的minSdkVersion对应的编译平台。
这也意味着当你引入一个预编译好的.so文件时,你需要检查它被编译所用的平台版本。
混合使用不同C++运行时编译的.so文件
.so文件可以依赖于不同的C++运行时,静态编译或者动态加载。混合使用不同版本的C++运行时可能导致很多奇怪的crash,是应该避免的。 作为一个经验法则,当只有一个.so文件时,静态编译C++运行时是没问题的,否则当存在多个.so文件时,应该让所有的.so文件都动态链接相同的 C++运行时。
这意味着当引入一个新的预编译.so文件,而且项目中还存在其他的.so文件时,我们需要首先确认新引入的.so文件使用的C++运行时是否和已经存在的.so文件一致。
没有为每个支持的CPU架构提供对应的.so文件
这一点在前文已经说到了,但你应该真的特别注意它,因为它可能发生在根本没有意识到的情况下。
例如:你的app支持armeabi-v7a和x86架构,然后使用Android Studio新增了一个函数库依赖,这个函数库包含.so文件并支持更多的CPU架构,例如新增android-gif-drawable函数库:
compile ‘pl.droidsonroids.gif:android-gif-drawable:1.1.+’
发布我们的app后,会发现它在某些设备上会发生Crash,例如Galaxy S6,最终可以发现只有64位目录下的.so文件被安装进手机。
解决方案:重新编译我们的.so文件使其支持缺失的ABIs,或者设置
ndk.abiFilters
显示指定支持的ABIs。
最后一点: 如果你是一个SDK提供者,但提供的函数库不支持所有的ABIs,那你将会搞砸你的用户,因为他们能支持的ABIs必将只能少于你提供的。
将.so文件放在错误的地方
我们往往很容易对.so文件应该放在或者生成到哪里感到困惑,下面是一个总结:
- Android Studio工程放在jniLibs/ABI目录中(当然也可以通过在build.gradle文件中的设置jniLibs.srcDir属性自己指定)
- Eclipse工程放在libs/ABI目录中(这也是ndk-build命令默认生成.so文件的目录)
- AAR压缩包中位于jni/ABI目录中(.so文件会自动包含到引用AAR压缩包的APK中)
- 最终APK文件中的lib/ABI目录中
- 通过PackageManager安装后,在小于Android 5.0的系统中,.so文件位于app的nativeLibraryPath目录中;在大于等于Android 5.0的系统中,.so文件位于app的nativeLibraryRootDir/CPU_ARCH目录中。
为啥不试下在main目录里面建立jniLibs目录,将so全部放到jniLibs目录里面不就搞定了
- Re: TechStone 2016-01-12 00:38发表 [回复]
- 回复邓孟鑫:还是放在main/libs里面,只要在build.gradle里面这样写:android { ... sourceSets { main { jni.srcDirs = [] jniLibs.srcDirs = ['libs'] } }}就可以了,表示我们不编译jni代码,直接从libs里面复制so库
- android studio 以及SO的关系
- 关于Android Studio导入第三方.so库,找不到so库以及找不到so库中方法的问题
- android Studio so的加载
- Android studio下的Android JNI调用以及动态链接库.so的生成
- Android Studio引入.so文件的正确姿势 以及调用.so 文件时报错has text relocations 解决
- Android Studio NDK CMake 指定so输出路径以及生成多个so的案例与总结
- Android Studio NDK CMake 指定so输出路径以及生成多个so的案例与总结
- 关于android studio导入jar包以及使用so库的一些心得w
- Android Studio如何导入jar,so,以及第三方的开源库?
- Android Studio如何导入jar,so,以及第三方的开源库?
- Android studio jni编译以及第三方so库的引用
- Android studio 使用Cmake完成C/C++ 的使用以及生成so文件
- Android Studio 如何导入jar,so,以及第三方的开源库
- Android studio 使用Cmake完成C/C++ 的使用以及生成so文件
- Android Studio NDK CMake 指定so输出路径以及生成多个so的案例与总结 # 设置so文件生成路径 # set(CMAKE_LIBRARY_OUTPUT_DIRECTORY $
- android studio NDK开发配置以及生成SO文件
- Android Studio NDK及so文件开发 以及常见错误
- Android Studio中so包的导入
- Sql server基础
- struts2校验器验证表单避免无效sql查询
- HDFS 高可用,hdfs-site.xml 配置及说明,更详细参考官网
- 可扩展的列表组件
- 关于在myeclipse 2014中发布web service服务时的报错解决
- android studio 以及SO的关系
- linux - grep | cut
- APP启动白屏、黑屏的问题
- adb logcat 命令行用法
- 待完成任务 —— appearance意义及功能使用方法
- SQL多表连接查询
- terminal 的一些指令
- 常用正则表达式
- 338. Counting Bits