1. 程式人生 > >關於Android Studio主Module與依賴Module同時引入so庫的問題

關於Android Studio主Module與依賴Module同時引入so庫的問題

在使用so庫的時候遇到一個問題,背景如下:

    專案中有一個錄影功能,將錄影功能抽取出來變成一個module,這個module引入了一個ffmpeg的so庫,將錄影功能整合後經測試好用。

    後來專案中需要整合定位功能,使用了高德定位,定位功能沒有抽取,而是直接寫在app中。此時再次點選錄影後發生crash,報出如下錯誤:

    java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader
    既在Load庫的時候找不到so檔案。

    主app中引入so的時候分別放在了 arm64-v8a 和 armeabi 中,錄影module引入的so放在armeabi-v7a中。

    看下這三個資料夾的作用:

     arm64-v8a是可以向下相容的,其下有armeabi-v7a,armeabi ;armeabi-v7a向下相容armeabi。對於一個cpu是arm64-v8a架構的手機,它執行app時,進入jnilibs去讀取庫檔案時,先看有沒有arm64-v8a資料夾;如果沒有該資料夾,去找armeabi-v7a資料夾,如果沒有,再去找armeabi資料夾,如果連這個資料夾也沒有,就丟擲異常
如果有arm64-v8a資料夾,那麼就去找特定名稱的.so檔案,注意:如果沒有找到,不會再往下(armeabi-v7a資料夾)找了,而是直接丟擲異常。

     將生成的apk解壓,發現lib下有三個資料夾,分別對應以上三種cpu架構,而我們的錄影so只在armeabi-v7a中。也就是說系統只在arm64中尋找錄影so,找不到自然就報錯了。

     然後嘗試將錄影so放入主app的arm64-v8a中,這樣同樣會出現個問題:

    .依賴Module引入的so庫必須存放在該module本身的jnilib目錄下,而不能放入app Module的庫目錄下。否則報錯。

  既然這樣不行拿就在錄影Module下建立一個arm64-v8a目錄,此時如果你有so支援64位處理器的話沒有問題,如果只有32位的so同樣不行。

     最後的解決方案是把app Module目錄下的arm64目錄改為armeabi-v7a,錄影Module中的結構保持不變,使得系統在載入so庫的時候直接到armeabi-v7a中尋找。解決問題