android多cpu架構(gòu)適配開篇-創(chuàng)新互聯(lián)

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

創(chuàng)新互聯(lián)擁有一支富有激情的企業(yè)網(wǎng)站制作團(tuán)隊(duì),在互聯(lián)網(wǎng)網(wǎng)站建設(shè)行業(yè)深耕10年,專業(yè)且經(jīng)驗(yàn)豐富。10年網(wǎng)站優(yōu)化營(yíng)銷經(jīng)驗(yàn),我們已為1000多家中小企業(yè)提供了網(wǎng)站制作、成都網(wǎng)站建設(shè)解決方案,按需網(wǎng)站制作,設(shè)計(jì)滿意,售后服務(wù)無(wú)憂。所有客戶皆提供一年免費(fèi)網(wǎng)站維護(hù)!

名詞解析:

    NDK:Native Development Kit

    JNI:Java Native Interface

    ABI: Application Binary Interface 應(yīng)用二進(jìn)制接口

Android Studio使用so庫(kù)

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

需要在build.gradle中添加指定jni庫(kù)目錄的語(yǔ)句

sourceSets {

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

}

2、使用AS默認(rèn)的位置:src/main/jniLibs

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

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

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

armeabi第5代 ARM v5TE,使用軟件浮點(diǎn)運(yùn)算,兼容所有ARM設(shè)備,通用性強(qiáng),速度慢
armeabi-v7a第7代 ARM v7,使用硬件浮點(diǎn)運(yùn)算,具有高級(jí)擴(kuò)展功能
arm64-v8a第8代,64位,包含AArch42、AArch74兩個(gè)執(zhí)行狀態(tài)對(duì)應(yīng)32、64bit
x86intel 32位,一般用于平板
x86_64intel 64位,一般用于平板
mips少接觸
mips64少接觸

安裝時(shí)的兼容性檢查:

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

  安裝app的時(shí)候,如果app使用了so文件,而不存在適合本機(jī)cpu架構(gòu)的so文件,會(huì)報(bào)如下錯(cuò)誤:

Installation failed with message INSTALL_FAILED_NO_MATCHING_ABIS.

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

運(yùn)行時(shí)的兼容性檢查:

1、檢查目標(biāo)目錄下是否存在的so庫(kù)文件

2、檢查存在的so文件是否符合當(dāng)前cpu架構(gòu)。

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

  例如:項(xiàng)目中使用了A、B、C三個(gè)第三方庫(kù)。其中A、B提供了armebi以及arm64-v8a版本的庫(kù)文件,而C只提供了armebi、armebi-v7a版本的庫(kù)文件。這時(shí)候只能夠刪除原有的arm64-v8a目錄,保留armeabi目錄,一般arm64的手機(jī)都能兼容使用armeabi版本的庫(kù)?;蛘邚?fù)制一份armeabi的so文件到缺少的目錄中(推薦)。

生成so文件:

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

Android加載so文件規(guī)則:

  當(dāng)你只提供了armeabi目錄時(shí),armeabi-v7a、arm64-v8a架構(gòu)的程序都會(huì)去armeabi里尋找,而當(dāng)你同時(shí)也提供了armeabi-v7a、armeabi-v8a目錄,而里面又不存在對(duì)應(yīng)的so庫(kù)時(shí),系統(tǒng)就不會(huì)再去armeabi里面尋找了,直接找不到報(bào)錯(cuò)。其他平臺(tái)也是如此。這里我踩了不少的坑,切記。

  一般來(lái)說(shuō),一些比較有名的第三方庫(kù)都會(huì)提供armeabi、armeabi-v7a、x86這三種類型的so文件,同時(shí)擁有這三種版本的app可以在所有機(jī)型上運(yùn)行。另外,越來(lái)越多的SDK會(huì)同時(shí)提供arm64-v8a版本。只包含armeabi的項(xiàng)目也可以在所有設(shè)備上運(yùn)行。

現(xiàn)實(shí)案例:

  我的項(xiàng)目中使用了armeabi、arm64-v8a兩種類型,而當(dāng)我需要使用某語(yǔ)音第三方庫(kù)的時(shí)候,發(fā)現(xiàn)只提供了armeabi、armeabi-v7a兩種類型的so文件,而我的手機(jī)是arm64-v8a的。所以只會(huì)使用arm64-v8a里面的so文件,當(dāng)使用到該語(yǔ)音庫(kù)時(shí)找不到對(duì)應(yīng)的so庫(kù),就會(huì)報(bào)錯(cuò)。理論上有以下兩種解決方法:

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

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

總結(jié):

  1. 當(dāng)你使用到so文件時(shí),保證每個(gè)子文件夾中文件名稱數(shù)量都是一致的。

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

參考文檔:

  與 .so 有關(guān)的一個(gè)長(zhǎng)年大坑

  Android 關(guān)于arm64-v8a、armeabi-v7a、armeabi、x86下的so文件兼容問(wèn)題

  關(guān)于Android的.so文件你所需要知道的

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。

標(biāo)題名稱:android多cpu架構(gòu)適配開篇-創(chuàng)新互聯(lián)
分享URL:http://muchs.cn/article30/djgsso.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供面包屑導(dǎo)航外貿(mào)建站、網(wǎng)站導(dǎo)航網(wǎng)站營(yíng)銷、網(wǎng)站設(shè)計(jì)公司ChatGPT

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

網(wǎng)站建設(shè)網(wǎng)站維護(hù)公司