非常多朋友在开发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. Codeforces Beta Round #9 (Div. 2 Only) E. Interesting Graph and Apples 构造题

    E. Interesting Graph and Apples 题目连接: http://www.codeforces.com/contest/9/problem/E Description Hexa ...

  2. 如何判断c语言的变量类型

    变量三要素: 一个变量有三个基本的要素,变量的名称,变量的类型,变量的值.所以int a = 10; 变量名为a,变量的存储类型为int型,变量的值为10. 变量还有一些属性如作用范围和存储类型. 变 ...

  3. JavaFX学习之Web

    PopupFeatures 处理新窗口    WebHistory 网页一般都带有历史记录的功能,可以回退,也可以前进,fx用WebHistory处理. final WebHistory wh = w ...

  4. Spring JavaConfig实例

    从Spring 3起,JavaConfig功能已经包含在Spring核心模块,它允许开发者将bean定义和在Spring配置XML文件到Java类中. 但是,仍然允许使用经典的XML方式来定义bean ...

  5. 扩展LVM 逻辑卷存储空间

    原因: 运行在Xen DomU的磁盘空间不足,需要扩展.DomU的存储主要为[os镜像文件+lv逻辑卷]的形式,现要对逻辑卷进行扩展. 过程(离线方式): 卸载逻辑卷 umount /dev/VolG ...

  6. EntityFramework:值语义的实体如何修改?

    背景 现在很流行值对象,值对象有如下特点:开发简单.使用简单和多线程安全.我试着让 EntityFramework 中的实体保持值语义,这样的话,对值语义实体的修改就应当等于“整体替换”,好像有点问题 ...

  7. xheditor

    完整按钮表 |:分隔符 /:强制换行 Cut:剪切 Copy:复制 Paste:粘贴 Pastetext:文本粘贴 Blocktag:段落标签 Fontface:字体 FontSize:字体大小 Bo ...

  8. 用 Redis 实现分布式锁(分析)

    文章转自:http://www.jeffkit.info/2011/07/1000/ Redis有一系列的命令,特点是以NX结尾,NX是Not eXists的缩写,如SETNX命令就应该理解为:SET ...

  9. PIR人体检查

    1.无变化时电压为0.8V左右 2.当检查到人体活动,电压保持为-1.3V,直到运动停止. 下面是示波器的截图

  10. Run Redis On Windows

    If you go to the current version and open up the bin > release folder, you'll get a ZIP file cont ...