java.lang.UnsatisfiedLinkError: dlopen failed: library “xxxxx.so” not found 報錯
昨天遇到這個報錯很久沒有解決,背景是在做jni開發,要在Java代碼中調用c++庫。
報錯發生在這個靜态加載庫的方法,我了解到c++代碼編譯後會生成so庫檔案,這個檔案可以在打包好的apk中檢視
如圖位置可以看到apk中的檔案。然而我發現第一個檔案夾中是有這個庫的,但是第二個沒有,這就是報錯的原因。
static {
System.loadLibrary("facedetect");
}
通過查詢我又了解到,這個兩個不同的檔案夾實際上對應不同的cpu編譯(就相當于不同的版本),在項目的gradle配置檔案中,我們可以定義輸出支援cpu版本過濾,需要注意的是,如果你是采用子產品進行開發,子產品和app的配置都會生效,我這裡報錯是因為app中沒有設定過濾導緻項目自帶的v8a so庫被裝進apk中,但是這個so庫不包含要加載的庫,因為這個庫不是編譯生成的,添加ndk過濾器後正常運作 abiFilters “armeabi”,“arm64-v8a”。
android{
buildTypes {
debug {
ndk {
abiFilters "armeabi","arm64-v8a"
}
}
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}