NDK 開發中,各種指令集的坑,arm64

2021-08-03 04:46:25 字數 1868 閱讀 9875

最近在ndk開發中遇到了乙個奇怪的問題,希望記錄下,可以幫到大家:

我編譯了一些 .so 動態庫,只編譯了armeabi-v7a、armeabi 指令集,其它指令集編譯不了,具體原因還沒查出。因為同時也呼叫了第三方的.so 動態庫,而第三方提供7個指令集,分別為:arm64-v8a、armeabi、armeabi-v7a、mips、mips64、x86、x86_64。 所以,我只能把剛編譯的動態庫填充到 armeabi、armeabi-v7a 兩個指令集目錄。

在jni 呼叫的時候,有些手機呼叫成功,有些手機不行,成功的有:

(vivo y51a) android 系統為:5.1 ,支援指令集:armeabi-v7a、armeabi

(oppo r9s) android 系統為:5.1 ,支援指令集:arm64-v8a、armeabi-v7a、armeabi

(魅族 note2) android 系統為:5.1 ,支援指令集:arm64-v8a、armeabi-v7a、armeabi

不成功的手機:

(華為 榮耀6) android 系統為:7.0 ,支援指令集:arm64-v8a、armeabi-v7a、armeabi

(華為 mate9) android 系統為:7.0 ,支援指令集:arm64-v8a、armeabi-v7a、armeabi

你可以通過 以下**獲取你手機支援的指令集:

string abis = new string{}; abis = build.supported_abis;
一般64位晶元的手機都會相容 32位的庫,只是執行時效能慢一點。如華為 mate9 的晶元就是 64位的,它首先會 查詢 字元陣列 abis 支援指令集 的第乙個元素:arm64-v8a,如果這個目錄沒有相應的 庫,就會到第二個元素目錄搜尋, 以此類推。

我不確定是因為華為手機的問題, 還是 android 7.0 系統的問題:當你在 jnilibs 目錄下建立了 arm64-v8a,程式就會直接在 arm64-v8a 目錄下查詢,如果查詢不到,就會直接報錯,而不會去其它 指令集目錄查詢,錯誤提示為:

除 armeabi-v7a、armeabi 目錄外的其它目錄都刪了,然後執行。 還是不行,各種嘗試,都沒有成功,後面我在 stackoverflow 找到乙個解決方案,鏈結如下:

按照stackoverflow 的解決方案是:

找到apk 安裝檔案,然後用rar 之類的解壓工具開啟:

lib 目錄,就是編譯後的靜態或者動態庫目錄,然後再進去看看:

果然, lib 目錄下 除 armeabi-v7a、armeabi 目錄外,還有其它目錄,我在 jnilibs目錄下 刪除了其它目錄,根本沒有起到作用,我覺得原因可能是之前 build 時候快取了 這些目錄,所以不管我怎麼在 jnilibs 目錄下刪除其它指令集目錄都沒用。 你可以嘗試在 android studio 的選單 build =》 clean project,然後再執行專案。

其次也可以 在 build.gradle 檔案下 新增如下配置:

android }}

該配置是 讓再構建build的時候只 加入armeabi-v7a', 'armeabi' 兩種指令集。最後,大功告成,以上手機都執行通過。目前大多數第三方庫 都已經提供 arm64-v8a 指令集, 所以最佳方案還是盡量去編譯 arm64-v8a 指令集。

tips:華為手機在系統方面走得比較前,更新迭代快,對許可權以及其它方面都比較多特殊的限制,對我們開發者來說是一種嘗試,也是一種挑戰,希望開發者不要忽視了它,畢竟它在大陸市場使用者率不低。

NDK 開發中,各種指令集的坑,arm64

最近在ndk開發中遇到了乙個奇怪的問題,希望記錄下,可以幫到大家 我編譯了一些 so 動態庫,只編譯了armeabi v7a armeabi 指令集,其它指令集編譯不了,具體原因還沒查出。因為同時也呼叫了第三方的.so 動態庫,而第三方提供7個指令集,分別為 arm64 v8a armeabi ar...

MMX指令集在C 中的使用

一 內聯彙編的一般原則 1 自由使用通用暫存器 eax,ebx,ecx和edx 2 其它暫存器利用堆疊保留,使用,最後恢復 一般的像下面這樣 a 二 內聯彙編 a 可以單獨使用 例如 a mov eax,anyval1 a mov ebx,anyval2三 函式返回值可以直接放到eax中,可以不理會...

arm中的組合語言之ARM指令集

一 arm指令集的分類 arm指令集可以分為六類 跳轉指令,資料處理指令,程式狀態暫存器傳輸指令,load store指令,協處理器指令和異常中斷指令。第一篇 跳轉指令 在arm中有兩種方式來實現程式的跳 一種是直接向pc暫存器 r15 中寫入目標位址值 一種是跳轉指令 通過 直接向pc暫存器寫入目...