91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

android多cpu架構適配開篇

發布時間:2020-07-12 01:53:31 來源:網絡 閱讀:12760 作者:一劍圍城 欄目:移動開發

簡介:做項目的時候經常會使用到so文件。例如使用高德地圖,其SDK中就包含了armeabi、armeabi-v7a、arm64-v8a、x86等其他文件夾,里面通常放著同樣名稱、同樣數量的so文件。實際使用過程中,關于這些so文件引發的問題確實不少,也不好解決。寫下此文,希望以后遇到相關的問題,能有個大概的思路。


名詞解析:

    NDK:Native Development Kit

    JNI:Java Native Interface

    ABI: Application Binary Interface 應用二進制接口


Android Studio使用so庫

1、使用和eclipse一樣在libs目錄下新建armeabi目錄的方式

需要在build.gradle中添加指定jni庫目錄的語句

sourceSets {

   main.jniLibs.srcDirs = ['libs'] //指定libs為jni的存放目錄

}

2、使用AS默認的位置:src/main/jniLibs

直接在src/main/下新建jniLibs目錄,將armeabi等目錄放到該目錄下即可

備注:AS可以直接右鍵新建同目錄下的jniLibs目錄,但該目錄不是編譯好的庫文件目錄,而是未編譯的本地代碼文件的目錄(這里指的是與java同級的jni目錄,放置cpp代碼的)


android支持的cpu架構(目前是七種)


armeabi第5代 ARM v5TE,使用軟件浮點運算,兼容所有ARM設備,通用性強,速度慢
armeabi-v7a第7代 ARM v7,使用硬件浮點運算,具有高級擴展功能
arm64-v8a第8代,64位,包含AArch42、AArch74兩個執行狀態對應32、64bit
x86intel 32位,一般用于平板
x86_64intel 64位,一般用于平板
mips少接觸
mips64少接觸


安裝時的兼容性檢查:

   安裝到系統中后,so文件會被提取在:data/app/com.xxxxxxxx.app-x/lib/目錄下(5.0版本)、/data/app-lib/目錄下(4.2版本),其中armeabi和armeabi-v7a會生成arm目錄,arm64-v8a會生成arm64目錄。

   安裝app的時候,如果app使用了so文件,而不存在適合本機cpu架構的so文件,會報如下錯誤:

Installation failed with message INSTALL_FAILED_NO_MATCHING_ABIS.

例如:在x86模擬器上就必須有x86版本的so文件夾。不然無法安裝成功。


運行時的兼容性檢查:

1、檢查目標目錄下是否存在的so庫文件

2、檢查存在的so文件是否符合當前cpu架構。

   對于情況一,一般規避的做法是:保證jnilibs目錄下x86、x84_64、armeabi、armeabi-v7a、arm64-v8a等目錄下的文件名稱數量是一致的。

   例如:項目中使用了A、B、C三個第三方庫。其中A、B提供了armebi以及arm64-v8a版本的庫文件,而C只提供了armebi、armebi-v7a版本的庫文件。這時候只能夠刪除原有的arm64-v8a目錄,保留armeabi目錄,一般arm64的手機都能兼容使用armeabi版本的庫。或者復制一份armeabi的so文件到缺少的目錄中(推薦)。


生成so文件:

   NDK交叉編譯時選定APP_ABI := armeabi x86 ...可以生成支持相應芯片的so文件。APP_ABI := all生成支持所有芯片指令集(目前七種)so文件。


Android加載so文件規則:

   當你只提供了armeabi目錄時,armeabi-v7a、arm64-v8a架構的程序都會去armeabi里尋找,而當你同時也提供了armeabi-v7a、armeabi-v8a目錄,而里面又不存在對應的so庫時,系統就不會再去armeabi里面尋找了,直接找不到報錯。其他平臺也是如此。這里我踩了不少的坑,切記。

   一般來說,一些比較有名的第三方庫都會提供armeabi、armeabi-v7a、x86這三種類型的so文件,同時擁有這三種版本的app可以在所有機型上運行。另外,越來越多的SDK會同時提供arm64-v8a版本。只包含armeabi的項目也可以在所有設備上運行。


現實案例:

   我的項目中使用了armeabi、arm64-v8a兩種類型,而當我需要使用某語音第三方庫的時候,發現只提供了armeabi、armeabi-v7a兩種類型的so文件,而我的手機是arm64-v8a的。所以只會使用arm64-v8a里面的so文件,當使用到該語音庫時找不到對應的so庫,就會報錯。理論上有以下兩種解決方法:

一、刪除所有arm64-v8a,只保留armeabi,全部使用兼容性最高的版本,但也運行速度最慢。

二、將該語音庫的armeabi版本的so復制到arm64-v8a中。單一so文件使用armeabi兼容版本。


總結:

  1. 當你使用到so文件時,保證每個子文件夾中文件名稱數量都是一致的。

  2. 對于只提供armeabi的第三方庫,復制一份armeabi的so文件到缺失的其他目錄中;或者只保留armeabi目錄(不推薦)


參考文檔:

   與 .so 有關的一個長年大坑

   Android 關于arm64-v8a、armeabi-v7a、armeabi、x86下的so文件兼容問題

   關于Android的.so文件你所需要知道的


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

鄱阳县| 重庆市| 青阳县| 金阳县| 普宁市| 大庆市| 林芝县| 余姚市| 乌恰县| 石阡县| 漠河县| 荆门市| 宜良县| 繁昌县| 扶绥县| 宝兴县| 区。| 吐鲁番市| 舞阳县| 砚山县| 同心县| 潞西市| 兴文县| 青神县| 信阳市| 辽中县| 英超| 三穗县| 乐业县| 高唐县| 灵石县| 孟连| 大足县| 饶河县| 蕉岭县| 邛崃市| 大厂| 通州市| 泸州市| 塘沽区| 金坛市|