天天看點

高德地圖java.lang.UnsatisfiedLinkError異常 找不到.so檔案

首先檢視.so檔案是否放置正确(具體怎麼操作,高德文檔有說明),如果沒有解決問題,運作在不同的手機上報錯,報錯原因是因為不同的手機cpu不一樣,程式在相應目錄下找不到.so檔案導緻報錯

解決方案:

首先通過Build.CPU_ABI方法擷取到與手機相比對存放.so檔案的檔案夾,接着在libs下建立該名字的檔案夾,在高德地圖api中下載下傳相應的.so檔案放入該檔案夾中,如果官方沒有提供則将armeabi檔案中的.so檔案拷貝到該檔案夾下

關于Android的.so檔案相關說明,更多詳情http://www.kejik.com/article/21884.html

在Android系統上,每一個CPU架構對應一個ABI:armeabi,armeabi-v7a,x86,mips,arm64-v8a,mips64,x86_64。很多裝置都支援多于一種的ABI。例如ARM64和x86裝置也可以同時運作armeabi-v7a和armeabi的二進制包。但最好是針對特定平台提供相應平台的二進制包,這種情況下運作時就少了一個模拟層(例如x86裝置上模拟arm的虛拟層),進而得到更好的性能(歸功于最近的架構更新,例如硬體fpu,更多的寄存器,更好的向量化等)。我們可以通過Build.SUPPORTED_ABIS得到根據偏好排序的裝置支援的ABI清單。但你不應該從你的應用程式中讀取它,因為Android包管理器安裝APK時,會自動選擇APK包中為對應系統ABI預編譯好的.so檔案,如果在對應的lib/ABI目錄中存在.so檔案的話。

.so檔案放置可能帶來的問題以及一些規則

你應該盡可能的提供專為每個ABI優化過的.so檔案,但要麼全部支援,要麼都不支援:你不應該混合着使用。你應該為每個ABI目錄提供對應的.so檔案。

當一個應用安裝在裝置上,隻有該裝置支援的CPU架構對應的.so檔案會被安裝。在x86裝置上,libs/x86目錄中如果存在.so檔案的話,會被安裝,如果不存在,則會選擇armeabi-v7a中的.so檔案,如果也不存在,則選擇armeabi目錄中的.so檔案(因為x86裝置也支援armeabi-v7a和armeabi)。

使用android-21平台版本編譯的.so檔案運作在android-15的裝置上,使用NDK時,你可能會傾向于使用最新的編譯平台,但事實上這是錯誤的,因為NDK平台不是後向相容的,而是前向相容的。推薦使用app的minSdkVersion對應的編譯平台。這也意味着當你引入一個預編譯好的.so檔案時,你需要檢查它被編譯所用的平台版本。

繼續閱讀