Androidndk开发打包时我们应该如何注意平台的兼容(x86,arm,arm-v7a)
2015-09-29 14:19
686 查看
很多朋友在开发Android JNI的的时候,会遇到find
library returned null的错误,因为某种原因,so没有打包到apk中。下面浅析下引起该错误的原因以及平台兼容性问题。
一般有两方面的原因:
总结一下在项目中的表现就是:
如果项目只包含了 armeabi,那么在所有Android设备都可以运行;
如果项目只包含了 armeabi-v7a,除armeabi架构的设备外都可以运行;
如果项目只包含了 x86,那么armeabi架构和armeabi-v7a的Android设备是无法运行的;
如果同时包含了 armeabi, armeabi-v7a和x86,所有设备都可以运行,程序在运行的时候去加载不同平台对应的so,这是较为完美的一种解决方案,同时也会导致包变大。
为了减小 apk 体积,只保留 armeabi 和 armeabi-v7a 两个文件夹,并保证这两个文件夹中 so 数量一致
对只提供 armeabi 版本的第三方 so,原样复制一份到 armeabi-v7a 文件夹
library returned null的错误,因为某种原因,so没有打包到apk中。下面浅析下引起该错误的原因以及平台兼容性问题。
一、没有将so打包到apk中的原因。
当你发现到find library returned null的错误时,其实最直接的解决办法就是解压apk,看看apk中的x86、armeabi、armeabi-v7a文件夹中是否有对应的so,此时你可能在对应的文件夹下发现少了so,然后再去查原因即可。一般有两方面的原因:
1.apk中有对应平台的文件夹,但是文件夹里却没有对应的so。
举个例子,apk中lib下面一旦出现x86文件夹,程序运行的时候就会去加载x86对应的库,但是如果此时x86文件夹没有将so放进来,则会遇到报错。2.第三方对平台的兼容策略与自己不一致。
可能第三方选择了只支持armeabi(假设某支付sdk),但是我们的游戏在Application.mk中配置了APP_ABI := all,如此,我们的游戏打包出 了所有平台的so,但是第三方却只有armeabi文件夹对应的so,造成程序运行异常,这种情况在开发期间最常见,一些小公司由于测试人员不足或者测试设备不足,上线后才发现这个问题也不奇怪。二、对于平台的支持,我们应该如何选择。
armeabi-v7a确实是可以兼容armeabi的,而v7a的CPU支持硬件浮点运算,目前绝大对数设备已经是v7a了,所以为了性能上的更优,就不要为了兼容放到armeabi。 x86是可以兼容armeabi平台运行的,无论是armeabi-v7a还是armeabi,同时带来的也是性能上的损耗,另外需要指出的是,打包出的x86的so,总会比armeabi平台的体积更小,对于性能有洁癖的童鞋们,还是建议在打包so的时候支持x86。具体会有怎样的性能损耗,作者还不能说的非常清楚,可以访问下intel官方在csdn的博客。总结一下在项目中的表现就是:
如果项目只包含了 armeabi,那么在所有Android设备都可以运行;
如果项目只包含了 armeabi-v7a,除armeabi架构的设备外都可以运行;
如果项目只包含了 x86,那么armeabi架构和armeabi-v7a的Android设备是无法运行的;
如果同时包含了 armeabi, armeabi-v7a和x86,所有设备都可以运行,程序在运行的时候去加载不同平台对应的so,这是较为完美的一种解决方案,同时也会导致包变大。
为了减小 apk 体积,只保留 armeabi 和 armeabi-v7a 两个文件夹,并保证这两个文件夹中 so 数量一致
对只提供 armeabi 版本的第三方 so,原样复制一份到 armeabi-v7a 文件夹
相关文章推荐
- Android之内存溢出(Out Of Memory)的总结
- Android M新控件之FloatingActionButton,TextInputLayout,Snackbar,TabLayout的使用
- Android Bitmap 内存溢出的问题
- js判断手机端Android手机还是iPhone手机
- 有哪些 Android 大牛的 blog 值得推荐?
- 打造AbsListView、RecyclerView的通用Adapter
- 360 Android 插件开发 DroidPlugin 代码分析 -随笔
- android使用GestureDetector实现手势下滑与ListView onTouchEvent 冲突问题 解决
- android自动升级应用实现
- Android -- Properties使用
- 【VLC-Android】vlc-android简例
- Android调用浏览器打开网址遇到的问题
- Android开发中出现异常问题的积累
- 六款值得推荐的android(安卓)开源框架简介
- 一个百度定位例子,把自己的经纬度转换为具体位置
- android:EditText属性/去边框
- Android-创建带单选项列表的对话框
- Android实现真正的ViewPager【平滑过渡】+【循环滚动】!!!顺带还有【末页跳转】。
- Android Contentprovider的学习实例总结
- Android双向滑动菜单完全解析,教你如何一分钟实现双向滑动特效