不少朋友在开发Android JNI的的时候,会遇到findlibrary returned null的错误,由于某种缘由,so没有打包到apk中。下面浅析下引发该错误的缘由以及平台兼容性问题。架构
当你发现到findlibrary returned null的错误时,其实最直接的解决办法就是解压apk,看看apk中的x8六、armeabi、armeabi-v7a文件夹中是否有对应的so,此时你可能在对应的文件夹下发现少了so,而后再去查缘由便可。
性能
通常有两方面的缘由:测试
1.apk中有对应平台的文件夹,可是文件夹里却没有对应的so。
spa
举个例子,apk中lib下面一旦出现x86文件夹,程序运行的时候就会去加载x86对应的库,可是若是此时x86文件夹没有将so放进来,则会遇到报错。游戏
可能第三方选择了只支持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,这是较为完美的一种解决方案,同时也会致使包变大。io