使用第三方庫出現(xiàn)找不到so庫UnsatisfiedLinkError錯誤的原因以及解決方案

首先這邊引用環(huán)信SDK工程師總結(jié)的出現(xiàn)這個問題的一些原因(稍作排版修改):
引用 / 環(huán)信SDK工程師分析 UnsatisfiedLinkError

前言

在開發(fā)項目的時候我們免不了使用一些第三方的庫來進行快速開發(fā)再膳,有些第三方庫只是簡單的一個jar包访雪,但是有些使用了jni開發(fā)婚度,因此會包含so庫文件皱卓,這個時候如果不消息我們就會遇到一個錯誤:java.lang.UnsatisfiedLinkError

最近經(jīng)常遇到有開發(fā)者在問使用環(huán)信sdk的時候出現(xiàn)這個錯誤恨搓;這里分享下問題原因以及解決方案院促;

相關(guān)信息

這里需要先解釋一下相關(guān)信息
hyphenatechatsdk提供的指令集類型僅提供armeabi-v7aarm64-v8a斧抱、x86三種;
armeabiarmeabi-v7a是相近似的指令集常拓,v7a是增強型指令集,運行速度辉浦,效率均有所提高弄抬,他們都是32位指令,并且兼容宪郊;arm64-v8a對應(yīng)arm64位指令集掂恕;
arm64位策略和intel IA32不一樣:intel64位指令是兼容intel32位指令,intel32位指令編譯的程序可以直接在intel64位機器上運行弛槐;但是arm不是懊亡,arm64位和arm32位是彼此獨立的指令系統(tǒng),不兼容乎串;arm這樣設(shè)計的原因是因為運行在嵌入式上店枣,設(shè)計指標(biāo)更趨向于效率,和耗電考量;實際上arm64位芯片上同時包含著arm64指令處理器和arm32位指令處理器鸯两,只不過兩個處理器彼此獨立闷旧;

導(dǎo)致產(chǎn)生UnsatisfiedLinkError的幾個原因

影響鏈接的限制條件: armeabi實際上可以運行在arm64位機器上,只不過Google增加了限制條件:

  1. Android4.x只要能找到so钧唐,就可以運行忙灼,so可以在armeabiarmeabi-v7a逾柿、arm64-v8a缀棍,so位置可以很隨意宅此;

  2. Android5.x開始机错,檢查更加嚴(yán)格,會只有和芯片型號對應(yīng)目錄的so會安裝到手機中父腕;

舉個例子:
開發(fā)環(huán)境下目錄結(jié)構(gòu)如下
libs/armeabi:libhyphenate.so libhyphenate_av.so
libs/armeabi-v7a:libmediadata.so
手機對應(yīng)的指令集是armeabi-v7a弱匪,然后安裝到手機的只有libmediadata.so

  1. Android6.x下璧亮,檢查更加嚴(yán)格萧诫,有一條規(guī)則,之前測試有遇到枝嘶,現(xiàn)在不太確認帘饶;
    libs/armeabi/: libhyphenate.so libhyphenate_av.so
    libs/arm64-v8a(沒有此目錄)
    arm64位機器上也可以運行,但是作為開發(fā)者通常會依賴其他開發(fā)包群扶,比如baiduMap及刻,也會用其他so,不能讓所有開發(fā)者都刪掉libs/arm64-v8a的目錄竞阐;不過開發(fā)者可以嘗試下刪除arm64-v8a缴饭,只留armeabi,這樣安裝包會很小骆莹,在各個平臺上也能運行颗搂;
    Google考量點是執(zhí)行速率,更流暢的用戶體驗幕垦,作為開發(fā)者丢氢,服務(wù)提供者,我們希望apk盡可能小先改,對執(zhí)行速度要求不高疚察;

  2. armeabiarmeabi-v7a可以互換,現(xiàn)在市面上的手機很少有armeabi的盏道,基本上是armeabi-v7aarm64位的高端機器稍浆。

  3. 查看手機芯片型號:cat /proc/cpuinfo, 仔細看一下打印信息,能夠看明白手機指令集,是32位還是64位衅枫。

  4. x86目錄嫁艇,通常對應(yīng)虛擬機,很多開發(fā)者喜歡在genymotion上開發(fā)調(diào)試弦撩,這個就對應(yīng)86步咪,x86和前面說的intel IA32是一回事,所以只提供32位的益楼,也能在x86-64位機器上運行猾漫;

  5. 我們的so還依賴于libsqlite.so,不過由于這個包從來沒有變化感凤,使用的是系統(tǒng)默認提供的/system/lib悯周,在Android 6.x及以下的平臺可以運行,Android7.x執(zhí)行更嚴(yán)格的安全檢查陪竿,禁止使用系統(tǒng)目錄的內(nèi)容禽翼,所以如果希望在Android7.x以上版本,需要把系統(tǒng)目錄的libsqlite.so拷貝出來族跛,也放在自己app對應(yīng)指令目錄下闰挡,由于目前Android7.x市面上沒有機型,所以目前不在考慮范圍礁哄;

  6. mips指令集的手機很少見长酗,聽說聯(lián)想有出過,沒見過;

  7. libs/armeabi/libhyphenate.solibs.without.audio/armeabi/libhyphenate.so是不同桐绒,libs/armeabi/libhyphenate.so會依賴于libs/armeabi/libhyphenate_av.so夺脾,如果找不到會報java.lang.UnsatisfiedLinkError

  8. 還有一個比較容易忽略的一點掏膏,現(xiàn)在我們的的項目一般都是引入好多個第三方庫劳翰,第六點也提到了使用baiduMap這點,就是當(dāng)一個項目引入多個庫馒疹,不同的庫有不同的so文件夾佳簸,當(dāng)其中一個支持的比較少,但是另一個比較全時颖变,也會出現(xiàn)這樣的錯誤生均,解決方法就是不支持的so文件夾刪除

舉個例子:
環(huán)信支持的指令集arm64-v8aarmeabi-v7a腥刹、x86
百度地圖支持的指令集arm64-v8a马胧、armeabiarmeabi-v7a衔峰、x86佩脊、x86_64蛙粘、mipsmips64
如果想在所有設(shè)備上都能運行威彰,需要把x86_64出牧、mipsmips64這些刪除歇盼;
根據(jù)前邊所說可以保留armeabiarmeabi-v7a文件夾舔痕,然后復(fù)制armeabi-v7a里的so文件到armeabi就行了

結(jié)語

所以如果大家再遇到這樣的問題,可以先根據(jù)以上信息排查下豹缀,無非就是某個庫的 so 文件放多了伯复,或者某個 so 庫的文件放少了,或者是 jar 包和 so 不匹配了邢笙,這些只要細心看下 ide 的日志提示啸如,很容易就解決,希望此篇文章能幫大家解決問題鸣剪,謝謝组底!

文筆有限,如果問題筐骇,歡迎指正 _~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市江滨,隨后出現(xiàn)的幾起案子铛纬,更是在濱河造成了極大的恐慌,老刑警劉巖唬滑,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件告唆,死亡現(xiàn)場離奇詭異,居然都是意外死亡晶密,警方通過查閱死者的電腦和手機擒悬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來稻艰,“玉大人懂牧,你說我怎么就攤上這事∽鹞穑” “怎么了僧凤?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長元扔。 經(jīng)常有香客問我躯保,道長,這世上最難降的妖魔是什么澎语? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任途事,我火速辦了婚禮验懊,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘尸变。我一直安慰自己鲁森,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布振惰。 她就那樣靜靜地躺著歌溉,像睡著了一般。 火紅的嫁衣襯著肌膚如雪骑晶。 梳的紋絲不亂的頭發(fā)上痛垛,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天,我揣著相機與錄音桶蛔,去河邊找鬼匙头。 笑死,一個胖子當(dāng)著我的面吹牛仔雷,可吹牛的內(nèi)容都是我干的蹂析。 我是一名探鬼主播,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼碟婆,長吁一口氣:“原來是場噩夢啊……” “哼电抚!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起竖共,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤蝙叛,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后公给,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體借帘,經(jīng)...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年淌铐,在試婚紗的時候發(fā)現(xiàn)自己被綠了肺然。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,727評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡腿准,死狀恐怖际起,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情释涛,我是刑警寧澤加叁,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站唇撬,受9級特大地震影響它匕,放射性物質(zhì)發(fā)生泄漏友酱。R本人自食惡果不足惜劈伴,卻給世界環(huán)境...
    茶點故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一畦贸、第九天 我趴在偏房一處隱蔽的房頂上張望桥温。 院中可真熱鬧,春花似錦烧给、人聲如沸燕偶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽指么。三九已至,卻和暖如春榴鼎,著一層夾襖步出監(jiān)牢的瞬間伯诬,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工巫财, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留盗似,地道東北人。 一個月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓平项,卻偏偏與公主長得像赫舒,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子闽瓢,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,619評論 2 354

推薦閱讀更多精彩內(nèi)容