Android裝置如何載入 so檔案以及如何適配

2021-07-24 23:39:59 字數 1184 閱讀 3309

原文:

1.android

裝置如何載入.so檔案? 

不同cpu架構

的android手機載入時會在libs下找自己對應的目錄,從對應的目錄下尋找需要的.so檔案;如果沒有對應的目錄,就會去armeabi下去尋找,如果已經有對應的目錄,但是如果沒有找到對應的.so檔案,也不會去armeabi下去尋找了。 

以x86裝置為例,x86裝置會在專案中的 libs資料夾尋找是否含有x86資料夾,如果含有x86資料夾,則預設為該專案有x86對應的so可執行檔案,只有x86資料夾而資料夾下沒有so,程式執行也是會出現find library returned null的錯誤的;如果工程本身不含有x86資料夾,則會尋找armeabi或者armeabi-v7a資料夾,相容執行。以armeabi-v7a裝置為例,該android裝置當然優先尋找libs目錄下的armeabi-v7a資料夾,同樣,如果只有armeabi-v7a資料夾而沒有 so也是會報錯的;如果找不到armeabi-v7a資料夾,則尋找armeabi資料夾,相容執行該資料夾下的so,但是不能相容執行x86的so。所以專案中如果只含有x86的so,在armeabi和armeabi-v7a也是無法執行的。以上就是不同cpu架構執行時載入so的策略。

2.對於不同的平台,我們應該怎麼去進行適配? 

目前主流的android裝置肯定是armeabi-v7a架構的,然後就是x86和armeabi了。如果同時包含了 armeabi, armeabi-v7a和x86,所有裝置都可以執行,程式在執行的時候去載入不同平台對應的so,這是較為完美的一種解決方案,但是同時也會導致包變大。 

armeabi-v7a是可以相容armeabi的,而v7a的cpu支援硬體浮點運算,目前絕大對數裝置已經是armeabi-v7a了,所以為了效能上的更優,就不要為了相容放到armeabi下了。x86也是可以相容armeabi平台執行的,另外需要指出的是,打出包的x86的so,總會比armeabi平台的體積更小,對於效能有潔癖的童鞋們,還是建議在打包so的時候支援x86。

3.如果第三方沒有提供對應平台的.so檔案怎麼辦? 

有一些第三方的類庫只提供了armeabi下的.so檔案,如果我們專案裡適配了armeabi-v7a和x86,如果不在對應的檔案下放對應的.so檔案,就可能導致某些android裝置會出一些問題,我們可以複製armeabi下得.so檔案到不同的資料夾下。如果第三方提供了不同平台的.so檔案,則複製不同平台的.so檔案到專案中對應的資料夾下即可。

android載入 so檔案指定核心

對於.so檔案 大家都不陌生,而如何引用,出現了很多方式。這裡做乙個總結,只要你記住了就ok了。首先將你.so檔案目錄考到專案或者modle的libs資料夾下面 如圖 上圖第一步就已經完成了。第二步 下面在你引入.so的modle 或者專案的 build.gradle檔案中新增對libs的引用 到此...

Android 的 so 檔案載入機制

nativelibrarydirectories 表示應用自身存放 so 檔案的目錄位址,影響著 so 檔案的載入流程 primarycpuabi 表示應用應該執行在哪種 abi 上,如 armeabi v7a 它影響著應用是執行在 32 位還是 64 位的程序上,進而影響到尋找系統指定的 so 檔...

讓android自動載入動態庫so

在ios上可以利用越獄後cydia substrate框架的mobileloader完成,吧plist和dylib放在 library mobilesubstrate dynamiclibraries目錄下即可 然而android上的cydia框架卻沒有類似的便利,同時系統好像也沒有此類支援,此時該...