JNI 學習總結

0xCAFEBOY發表於2019-05-25

前言

在 Android 專案中,大家都會或多或少接觸過 JNI。一般都是底層同事給出動態庫 (.so) ,然後整合進專案中。本文你將學到, 靜態庫與動態庫的區別, 什麼是ABI,以及動態庫的尋找流程

閱讀本文大概需要 2 分鐘

目錄

目錄

概念

靜態庫 & 動態庫

眾所周知,Android 是基於 Linux 開發的系統,在 Linux 系統中,共有兩種庫 靜態庫動態庫,區別如下:

區別總結

這裡做一個總結,對於靜態庫來說:

  • 優是:編譯後的執行程式不再需要外部函式庫的支援,這是由於靜態庫的連結方式決定的,靜態庫是將整個函式庫的所有資料打包整合進宿主程式碼
  • 缺點:由於靜態庫的連結方式,因此如果靜態庫發生更新,宿主程式必須重新編譯。

對於動態庫來說:

  • 優點:動態庫升級並不影響宿主程式,不需要重新編譯宿主工程。所以升級動態庫十分方便。
  • 缺點:由於動態庫的連結方式,函式庫並沒有整合進入程式,因此程式的執行環境必須提供對應的支援庫。

ABI

由於 Android 機型眾多,不同的廠商的機型往往使用不同的 CPU 架構,支援不同的指令集。CPU 與指令集的對應關係通過應用的二進位制介面描述,這個介面就是 ABI. ABI 的需要定義的具體內容如下:

  • 機器程式碼應使用的 CPU 指令集
  • 執行時記憶體儲存和載入的位元組順序
  • 可執行二進位制檔案(例如程式和共享庫)的格式,以及它支援的內容型別
  • 在程式碼與系統之間傳遞資料的各種規範。這些規範包括對齊限制,以及系統呼叫時如何使用堆疊和暫存器。
  • 執行時可用於機器函式程式碼的符號列表 - 通常來自非常具體的庫集

總結一下 ABI 的作用,就是在機器程式碼執行時,精確的定義機器程式碼如何與系統互動。因此必須為每個 CPU 架構指定 ABI

業務流程

上文了解到了 Android 常用的靜態庫與動態庫的概念及區別,下面我們來總結一下 Android 動態庫的載入流程

動態庫(.so)的尋找流程

總結一下,流程圖如圖所示:

動態庫(.so)的載入流程圖

簡單來說,就是先去預設目錄(nativeLibraryDir)尋找。若沒找到則去對應系統指定目錄尋找。


麻煩點個喜歡,您的贊同 & 鼓勵是我寫作的最大動力!