天天看點

【Android】java.lang.UnsatisfiedLinkError: dlopen failed: library “xxxxx.so“ not found 報錯

java.lang.UnsatisfiedLinkError: dlopen failed: library “xxxxx.so” not found 報錯

昨天遇到這個報錯很久沒有解決,背景是在做jni開發,要在Java代碼中調用c++庫。

報錯發生在這個靜态加載庫的方法,我了解到c++代碼編譯後會生成so庫檔案,這個檔案可以在打包好的apk中檢視

如圖位置可以看到apk中的檔案。然而我發現第一個檔案夾中是有這個庫的,但是第二個沒有,這就是報錯的原因。

static {
        System.loadLibrary("facedetect");
}
           
【Android】java.lang.UnsatisfiedLinkError: dlopen failed: library “xxxxx.so“ not found 報錯

通過查詢我又了解到,這個兩個不同的檔案夾實際上對應不同的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'
      }
 }