(一)Android Studio UnsatisfiedLinkError錯誤的解決辦法**
1:當(dāng)程序報錯:
Caused by: java.lang.UnsatisfiedLinkError: com.android.tools.fd.runtime.IncrementalClassLoader$DelegateClassLoader[DexPathList
多半原因是so文件沒有正常加載
2:查明原因:
先判斷是否忘記拷貝對應(yīng)的so文件到對應(yīng)的JNI目錄
查明手機(jī)cpu架構(gòu),到對應(yīng)JNI目錄查看是否有對應(yīng)的so文件
3:解決辦法:
1)將對應(yīng)的so文件拷貝到對應(yīng)的JNI架構(gòu)目錄中
2)如果只有其中某些架構(gòu)的so文件,但是手機(jī)的架構(gòu)有不屬于其中庵寞,那可以在項目中這樣設(shè)置:
<pre style="box-sizing: border-box; outline: 0px; margin: 0px 0px 24px; padding: 8px; position: relative; font-family: Monaco, Menlo, Consolas, "Courier New", monospace; white-space: pre-wrap; overflow-wrap: break-word; overflow-x: auto; font-size: 14px; line-height: 1.42857; color: rgb(37, 37, 37); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-style: initial; text-decoration-color: initial; border: 1px solid rgb(204, 204, 204);">android { defaultConfig { ndk { // 設(shè)置支持的 SO 庫構(gòu)架喇闸,注意這里要根據(jù)你的實際情況來設(shè)置 abiFilters 'armeabi'// 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64', 'mips', 'mips64' } } } 如果在添加 “abiFilter” 之后 Android Studio 出現(xiàn)以下提示: NDK integration is deprecated in the current plugin. Consider trying the new experimental plugin 在項目根目錄的 gradle.properties 文件中添加: android.useDeprecatedNdk=true</pre>
需要注意的是:這種方法對應(yīng)64位架構(gòu)的手機(jī),但是只有32位的so文件比較有效惶室,關(guān)于架構(gòu)的知識可以查閱百度說明
64位(arm64-v8a)架構(gòu)手機(jī)可以運(yùn)行32位(armeabi armeabi-v7a)的so文件
(二)android studio加載 so文件以及出錯当娱。android java.lang.UnsatisfiedLinkError: 分析及解決方法*
.so庫放到主module的libs/下的對應(yīng)CPU架構(gòu)目錄中卖局,比如libs/armeabi中浓若。
主module的build.gradle文件里面渺杉,android標(biāo)簽里添加:
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
這里也有個:http://www.jb51.net/softjc/399605.html
然后是出錯:
android java.lang.UnsatisfiedLinkError: 分析及解決方法"
一, jni還沒有編譯 是一邊編譯一邊用的
這要分兩種情況:
第一種是unsatisfiedlinkerror:dll名稱。說明dll沒有放到合適的位置挪钓。對于android開發(fā)是越,我們一般把so放在 libs目錄下,但是還是會出現(xiàn)這個錯誤碌上。根本原因system.loadlibrary函數(shù)會加載你指定的so倚评,該so中需要鏈接的所有符號都需要能夠鏈接到,如果有一個鏈接不成功馏予,那么整個so也會加載失敗蔓纠。仔細(xì)檢查so中需要的所有符號,確保其存在且在正確的位置上吗蚌。
第二種是unsatisfiedlinkerror:方法名稱。說明dll已經(jīng)成功加載纯出,但是方法名字錯了蚯妇。這個錯誤最最常見而且基本的解決方法是:仔細(xì)對比你的native 方法的原型確保與javah生成的原型一致敷燎。在java端修改native方法名稱一定要記得更新c/c++端的函數(shù)名稱,這是造成此類錯誤最常見的原因箩言。
二硬贯,是jni已經(jīng)編譯過 直接用別人編譯好的so庫
你建的項目放loadlibrary()的類的包名要和原項目編譯jni時loadlibrary()所在的類名應(yīng)該一致 ,因為jni好像是根據(jù)java包名來命名的陨收,所以改成一致的名字 就ok了
(三)Android studio java.lang.UnsatisfiedLinkError加載.so文件失敗解決辦法
問題:
java.lang.UnsatisfiedLinkError:
dalvik.system.PathClassLoader[DexPathList[[zip file
"/data/app/com.example.demozd-1/base.apk"],nativeLibraryDirectories=
[/vendor/lib64, /system/lib64]]] couldn't find "libmsc.so"
很明顯是程序運(yùn)行的時候找不到.so文件導(dǎo)致的饭豹。
解決辦法:
1.確定你的項目里確實有.so文件,如果錯誤和我上面的一樣找不到lib64巴拉巴拉的务漩,你還要確定你的項目里有arm64-v8a這個文件夾拄衰,沒有的話就建一個,然后把a(bǔ)rmeabi中的.so文件拷過去一份饵骨;
2.如果你把所有的.so文件夾都放在libs下了翘悉,需要在你的build.gradle文件中android大括號中加入下面這段代碼:
[java] view plaincopy
<embed id="ZeroClipboardMovie_1"
src="https://csdnimg.cn/public/highlighter/ZeroClipboard.swf"
loop="false"
menu="false"
quality="best"
bgcolor="#ffffff"
width="16"
height="16"
name="ZeroClipboardMovie_1"
align="middle"
allowscriptaccess="always"
allowfullscreen="false"
type="application/x-shockwave-flash"
pluginspage="http://www.macromedia.com/go/getflashplayer"
flashvars="id=1&width=16&height=16"
wmode="transparent" style="box-sizing: border-box;
outline: 0px;
margin: 0px;
padding: 0px;
overflow-wrap: break-word;">
<embed id="ZeroClipboardMovie_2"
src="https://csdnimg.cn/public/highlighter/ZeroClipboard.swf"
loop="false"
menu="false"
quality="best"
bgcolor="#ffffff"
width="16"
height="16"
name="ZeroClipboardMovie_2"
align="middle"
allowscriptaccess="always"
allowfullscreen="false"
type="application/x-shockwave-flash"
pluginspage="http://www.macromedia.com/go/getflashplayer"
flashvars="id=2&width=16&height=16" wmode="transparent"
style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px;
overflow-wrap: break-word;">
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
3.如果你的所有.so文件夾是在jniLibs下,那么要確保你的jniLibs文件夾在src/main/這個路徑下居触,不能在src同級目錄妖混。