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

來源:互聯網
上載者:User

標籤:

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

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.