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

Android设备载入so怎样选择


眼下主流的Android设备肯定是armeabi-v7a架构的,然后就是x86和armeabi了。

那么Android设备在执行程序时怎样选择载入包中的哪个so呢?

x86设备肯定优先寻找x86目录下的so。armeabi-v7a架构的设备肯定优先选择寻找项目中armeabi-v7a目录下的so。那假设项目中没有相应的目录和so呢?
我们以x86设备为例,x86设备会在项目中的 libs目录寻找是否含有x86目录,假设含有x86目录,则默觉得该项目有x86相应的so可执行的,仅仅有x86目录而目录下没有so。程序执行也是会出现findlibrary returned null的错误的。假设project本身不含有x86目录,则会寻找armeabi或者armeabi-v7a目录,兼容执行。
以armeabi-v7a设备为例(如今大多数设备都是armeabi-v7a架构的)。该Android设备当然优先寻找libs目录下的armeabi-v7a目录,相同,假设仅仅有armeabi-v7a目录而没有 so也是会报错的。假设找不到armeabi-v7a目录,则寻找armeabi目录。兼容执行该目录下的so,可是不能兼容执行x86的so。所以项目中假设仅仅含有x86的so。在armeabi和armeabi-v7a也是无法执行的。
以上就是不同CPU架构执行时载入so的策略。

没有将so打包到apk中的原因。

当你发现到findlibrary returned null的错误时。根本原因是so没有放到相应的目录中去,事实上最直接的解决的方法就是解压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,这是较为完美的一种解决方式,同一时候也会导致包变大。

findlibrary returned null产生的联想,Android ndk开发打包时我们应该怎样注意平台的兼容(x86,arm,arm-v7a)的更多相关文章

  1. android 高德地图API 之 java.lang.UnsatisfiedLinkError: Couldn't load amapv3: findLibrary returned null错误

    错误场景: 运行android app时,在运行到调用高德地图API时,出现 “java.lang.UnsatisfiedLinkError: Couldn't load amapv3: findLi ...

  2. Android中运行的错误:java.lang.UnsatisfiedLinkError: Couldn't load locSDK3: findLibrary returned null.

    ---恢复内容开始--- 明明已经加入了liblocSDK3.so,但总是无法定位.提示错误java.lang.UnsatisfiedLinkError: Couldn't load locSDK3: ...

  3. Android中执行的错误:java.lang.UnsatisfiedLinkError: Couldn't load locSDK3: findLibrary returned null.

    今天在使用百度地图的时候执行发现报错: 明明已经增加了liblocSDK3.so.但总是无法定位.提示错误java.lang.UnsatisfiedLinkError: Couldn't load l ...

  4. findlibrary returned null

    转载请标明出处,维权必究:https://www.cnblogs.com/tangZH/p/10181330.html 该错误是在加载so库的时候出现的,就是找不到so库. 一.检查jinLibs目录 ...

  5. 开发错误记录13:java.lang.UnsatisfiedLinkError: Couldn't load xxx.so: findLibrary returned null

    今天在导入环信开发包时,编译报如下错: java.lang.UnsatisfiedLinkError: Couldn't load hyphenate_av from loader dalvik.sy ...

  6. Android NDK 开发(三)--常见错误锦集合Log的使用【转】

    转载请注明出处:http://blog.csdn.net/allen315410/article/details/41826511  Android NDK开发经常因某些因素会出现一些意想不到的错误, ...

  7. Android NDK 开发(四)java传递数据到C【转】

    转载请注明出处:http://blog.csdn.net/allen315410/article/details/41845701 前面几篇文章介绍了Android NDK开发的简单概念.常见错误及处 ...

  8. !! 2.对十份论文和报告中的关于OpenCV和Android NDK开发的总结

    http://hujiaweibujidao.github.io/blog/2013/11/18/android-ndk-and-opencv-development-3/ Android Ndk a ...

  9. Android NDK开发及OpenCV初步学习笔记

    https://www.jianshu.com/p/c29bb20908da Android NDK开发及OpenCV初步学习笔记 Super_圣代 关注 2017.08.19 00:55* 字数 6 ...

随机推荐

  1. 快速排序及查找第K个大的数。

    本文提供了一种基于分治法思想的,查找第K个大的数,可以使得时间复杂地低于nlogn. 因为快排的平均时间复杂度为nlogn,但是快排是全部序列的排序, 本文查找第k大的数,则不必对整个序列进行排序.请 ...

  2. PSCollectionView瀑布流实现

    [-] 一基本原理 二具体实现 相关数据结构 视图更新方式 relayoutViews方法 removeAndAddCellsIfNecessary方法 select方法 重用数据块视图机制 三使用方 ...

  3. XY8782S00 BL-W8782 BL-R8782MS1 SDIO接口 高性能、低功耗、体积小 wifi无线模块

    1.产品简介 BL-8782是一款高性能.低功耗.体积小SDIO接口无线模组,符合IEEE802.11N标准,并向下兼容IEEE802.11B/G标准,支持IEEE 802.11i安全协议,以及IEE ...

  4. 以前写SpringMVC的时候,如果需要访问一个页面,必须要写Controller类,然后再写一个方法跳转到页面,感觉好麻烦,其实重写WebMvcConfigurerAdapter中的addViewControllers方法即可达到效果了

    以前写SpringMVC的时候,如果需要访问一个页面,必须要写Controller类,然后再写一个方法跳转到页面,感觉好麻烦,其实重写WebMvcConfigurerAdapter中的addViewC ...

  5. mysql知识点(二)

    1.什么叫聚集索引和非聚集索引? 答: 聚集索引:该索引中键值的逻辑顺序决定了表中相应行的物理顺序.      聚集索引确定表中数据的物理顺序.聚集索引类似于电话簿,后者按姓氏排列数据.由于聚集索引规 ...

  6. 【redis】spring boot中 使用redis hash 操作 --- 之 使用redis实现库存的并发有序操作

    示例: @Autowired StringRedisTemplate redisTemplate; @Override public void dealRedis(Dealer dealer) { d ...

  7. [翻译] SoundManager 音频管理器

    SoundManager 音频管理器 https://github.com/nicklockwood/SoundManager Purpose SoundManager is a simple cla ...

  8. android RecyclerView (三):ItemAnimator 详解

    本文继上篇 ItemDecoration 之后,是深入理解 RecyclerView 系列的第二篇,关注于 ItemAnimator,主要是分析 RecyclerView Animators 这个库的 ...

  9. arm交叉编译opencv

    问题:undefined reference to `pthread_spin_init'解:修改CMakeCache.txt,CMAKE_EXE_LINKER_FLAGS原来为空,加上-lpthre ...

  10. java 中函数的参数传递详细介绍

    java中函数的参数传递 总结: 1.将对象(对象的引用)作为参数传递时传递的是引用(相当于指针).也就是说函数内对参数所做的修改会影响原来的对象.  2.当将基本类型或基本类型的包装集作为参数传递时 ...