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

很多朋友在開發AndroidJNI的的時候,會遇到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,這是較為完美的一種解決方案,同時也會導致包變大。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容