关闭

Android JNI的的时候,会遇到findlibrary returned null的错误

597人阅读 评论(0) 收藏 举报
分类:

很多朋友在开发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,这是较为完美的一种解决方案,同时也会导致包变大。


因为我的项目里面有一个so文件是另外一家公司生成的,由于没有了c语言的源代码所以无法进行ndk操作。最后的解决办法就是jnilibs下面只留下了一个armeabi文件夹。但是我并不知道这样杀鸡取卵的方式对性能的影响到底有多大。如果有高手路过,求打脸。

0
0
查看评论

解决so库导入AndroidStudio无法被调用的问题

解决so库导入AndroidStudio无法被调用的问题 java.lang.UnsatisfiedLinkError: Couldn't load weibosdkcore from loader dalvik.system.PathClassLoader[DexPathList[[zip...
  • zml_2015
  • zml_2015
  • 2016-09-12 11:35
  • 3924

NDK开发学习- findLibrary returned null错误

在学习NDK开发,自己写得例子中,出现了java.lang.UnsatisfiedLinkError: Couldn't load xxx.so: findLibrary returned null 因为都是自学,好多东西都不懂,只好去对比samples,网上找资料。 后来知道了,在NDK...
  • treasure3334
  • treasure3334
  • 2013-12-06 17:55
  • 12746

findlibrary returned null产生的联想,Android ndk开发打包时我们应该如何注意平台的兼容(x86,arm,arm-v7a)

很多朋友在开发Android JNI的的时候,会遇到findlibrary returned null的错误,因为某种原因,so没有打包到apk中。下面浅析下引起该错误的原因以及平台兼容性问题。 一、没有将so打包到apk中的原因。 当你发现到findlibrary returned null的错误...
  • wangbin_jxust
  • wangbin_jxust
  • 2014-10-09 10:28
  • 5270

java.lang.UnsatisfiedLinkError,findLibrary returned null的一种可能的解决方式

今天弄NDK+JNI,编译没问题,但死活运行失败,报的错误是:  E/AndroidRuntime(10679): java.lang.UnsatisfiedLinkError: Couldn't load libfilterengine from loader dalvik.s...
  • l465659833
  • l465659833
  • 2015-10-30 21:02
  • 702

Couldn't load BaiduMapSDK_v3_1_0: findLibrary returned null

在搞地图是运行了几次,突然就泵
  • telencool
  • telencool
  • 2014-09-12 18:07
  • 5493

Android NDK 运行错误:java.lang.UnsatisfiedLinkError: Couldn't load XXX indLibrary returned null

今天将一个带有C++的android混合项目倒出的Android Studio,运行起来出现了如下错误: 5-31 18:45:52.320 10741-10741/com.example.hellojni E/AndroidRuntime﹕ FATAL EXCEPTION: main P...
  • yy1300326388
  • yy1300326388
  • 2015-05-31 20:27
  • 27717

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

今天在使用百度地图的时候运行发现报错: 明明已经加入了liblocSDK3.so,但总是无法定位。提示错误java.lang.UnsatisfiedLinkError: Couldn't load locSDK3: findLibrary returned null. 网上找了很多的资料找...
  • jiangwei0910410003
  • jiangwei0910410003
  • 2013-12-26 15:29
  • 77423

Android JNI的的时候,会遇到findlibrary returned null的错误

很多朋友在开发Android JNI的的时候,会遇到findlibrary returned null的错误,因为某种原因,so没有打包到apk中。下面浅析下引起该错误的原因以及平台兼容性问题。 一、没有将so打包到apk中的原因。 当你发现到findlibrary ret...
  • ocean_chang
  • ocean_chang
  • 2015-11-20 10:05
  • 597

cmake FIND_LIBRARY

LINK_LIBRARY似乎是一个需要避免的命令, 取而代之的是FIND_LIBRARY, 其基本用法是 #在指定目录下搜索一个库, 保存在变量MY_LIB中 FIND_LIBRARY(MY_LIB libmylib.a ./) #链接这个库 TARGET_LINK_LIBR...
  • u013677866
  • u013677866
  • 2014-12-06 12:02
  • 4650

关于Android Studio报错java.lang.UnsatisfiedLinkError: Couldn't load faceppapi: findLibrary returned null

最近使用第三方库face++做一个人脸识别的demo,按照文档编写后一直无法运行,报错: java.lang.UnsatisfiedLinkError: Couldn't load faceppapi: findLibrary returned null 产生原因:实际上是由于so文件没有...
  • kaoshibuguaA
  • kaoshibuguaA
  • 2015-12-29 14:13
  • 985
    个人资料
    • 访问:7056次
    • 积分:175
    • 等级:
    • 排名:千里之外
    • 原创:11篇
    • 转载:1篇
    • 译文:0篇
    • 评论:0条