【轉】關於Android的.so文件你所須要知道的(二)


Androidndk開發打包時咱們應該如何注意平臺的兼容(x86,arm,arm-v7a)

不少朋友在開發Android JNI的的時候,會遇到findlibrary returned null的錯誤,由於某種緣由,so沒有打包到apk中。下面淺析下引發該錯誤的緣由以及平臺兼容性問題。架構

1、沒有將so打包到apk中的緣由。

當你發現到findlibrary returned null的錯誤時,其實最直接的解決辦法就是解壓apk,看看apk中的x8六、armeabi、armeabi-v7a文件夾中是否有對應的so,此時你可能在對應的文件夾下發現少了so,而後再去查緣由便可。
性能

通常有兩方面的緣由:測試

1.apk中有對應平臺的文件夾,可是文件夾裏卻沒有對應的so。
spa

舉個例子,apk中lib下面一旦出現x86文件夾,程序運行的時候就會去加載x86對應的庫,可是若是此時x86文件夾沒有將so放進來,則會遇到報錯。遊戲

2.第三方對平臺的兼容策略與本身不一致。

可能第三方選擇了只支持armeabi(假設某支付sdk),可是咱們的遊戲在Application.mk中配置了APP_ABI := all,如此,咱們的遊戲打包出 了全部平臺的so,可是第三方卻只有armeabi文件夾對應的so,形成程序運行異常,這種狀況在開發期間最多見,一些小公司因爲測試人員不足或者測試設備不足,上線後才發現這個問題也不奇怪。開發

2、對於平臺的支持,咱們應該如何選擇。

    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

相關文章
相關標籤/搜索