作者:Insomnia
欢迎转载,如果说的有问题,感谢指出,及时更正。谢谢

引言:

很多朋友在开发Android JNI的的时候,会遇到findlibrary returned
null的错误,因为某种原因,so没有打包到apk中。下面浅析下引起该错误的原因以及平台兼容性问题。

一、没有将so打包到apk中的原因:

当你发现到findlibrary 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,这是较为完美的一种解决方案,同时也会导致包变大。

结束语:

本人也曾试过将arm-v7a直接复制到arm-v8a,貌似是支持arm64位的(当时测的机型是redmi note 3)。不过还是自己测的比较准确。

更多相关文章

  1. Android* 教程:使用英特尔® 线程构建模块编写多线程应用
  2. Android浪潮
  3. Android源代码加入SDK,在程序中查看android源代码
  4. 「Android集成微信支付」面试题回答思路
  5. android 入门不顺啊,解压android_gingerbread_realv210_ver_1_0.t
  6. Flutter多平台适配机制就是这么简单
  7. Android中仿微信选择图片并展示在RecyclerView中
  8. Android(安卓)Studio 中提示 Private field 'mType' is assigned
  9. Android开源手机平台揭秘和未来发展

随机推荐

  1. mysql定时自动备份数据库的方法步骤
  2. MYSQL数据库基础之Join操作原理
  3. MySQL高可用架构之MHA架构全解
  4. MySQL一些常用高级SQL语句
  5. MySQL系列之十二 备份与恢复
  6. MySQL定时全库备份数据库
  7. MySQL系列之十 MySQL事务隔离实现并发控
  8. MySQL系列之十一 日志记录
  9. MySQL系列之四 SQL语法
  10. MySQL系列之七 MySQL存储引擎