不少朋友在開發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