Android Studio中.so包使用問(wèn)題介紹
簡(jiǎn)介
最近在項(xiàng)目中遇到了關(guān)于.so包使用中的問(wèn)題惫霸,在此記錄下問(wèn)題的解決方案。
本文會(huì)介紹到關(guān)于.so包在Android Studio中的使用和在使用過(guò)程中的問(wèn)題以及其解決方法架诞。
使用
.so包在Android Studio中的使用其實(shí)就是通過(guò)gradle腳本告訴編譯器去哪里找炎辨,而默認(rèn)的配置中也包含了某個(gè)文件夾下就能直接識(shí)別羡滑。
這個(gè)能直接識(shí)別目錄就是項(xiàng)目的/src/main/文件夾下的jniLibs文件夾中,其中jniLibs得自己創(chuàng)建唠梨,文件名必須是這個(gè)袋励。因?yàn)樵谀J(rèn)的配置中有這么一句
sourceSets {
main {
jniLibs.srcDirs = ['src/main/jniLibs']
}
}
這就是在告訴編譯器,我的.so包你可以去哪里找到姻成。
明白了原理插龄,我們也可以修改這個(gè)配置,例如改為
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
這樣我們就可以像Eclipse那樣把so包直接放到libs文件夾下了科展。
問(wèn)題
使用也是比較簡(jiǎn)單均牢,而當(dāng)我們?cè)谝昧艘恍┑谌降膸?kù)的時(shí)候,基于某些原因使用到了.so包才睹,但是提供的cpu架構(gòu)又不統(tǒng)一徘跪,就會(huì)導(dǎo)致在某個(gè)cpu架構(gòu)下找不到對(duì)應(yīng)的.so包,這時(shí)候程序就會(huì)毫無(wú)疑問(wèn)的崩潰掉琅攘,而且這種問(wèn)題有時(shí)候還不是那么容易測(cè)到垮庐。
而導(dǎo)致這個(gè)問(wèn)題的原因也在描述中說(shuō)到,其實(shí)就是因?yàn)樵谀承ヽpu架構(gòu)下沒(méi)有找到對(duì)應(yīng)的.so包坞琴,既然找到了問(wèn)題哨查,那么就簡(jiǎn)單了,因?yàn)槲覀冎灰WC在程序添加的cpu架構(gòu)中都包含使用到的.so包剧辐,那么就不會(huì)出現(xiàn)找不到的問(wèn)題了寒亥,其中缺省的.so包可以使用armeabi架構(gòu)下的對(duì)應(yīng).so包來(lái)代替;
解決問(wèn)題的原理說(shuō)清楚了荧关,操作起來(lái)就簡(jiǎn)單了溉奕,有兩種方法:
- 把引用到的三方庫(kù)的so包都統(tǒng)一保留某些個(gè)cpu架構(gòu)的
- 使用gradle腳本只留下萬(wàn)能的cpu架構(gòu)(armeabi),具體為什么只留下一個(gè)的原因,主要是在使用的過(guò)程中發(fā)現(xiàn)該腳本不會(huì)把某些沒(méi)有.so包的cpu架構(gòu)復(fù)制過(guò)去忍啤,那就還是沒(méi)有加勤,所以只留armeabi,因?yàn)檫@個(gè)是肯定會(huì)有的,腳本如下:
ndk {
abiFilters 'armeabi'
//, 'x86', 'armeabi-v7a', 'x86_64', 'arm64-v8a', mips, mips64
加入需要生成的架構(gòu)
}
這樣問(wèn)題就基本解決了鳄梅,如果只保留一個(gè)的話柿祈,就會(huì)在某些架構(gòu)上三方庫(kù)的性能下降墩瞳,但是至少保證了幾乎不會(huì)直接奔潰囤屹。