NDK開發系列第一章

Doctor明發表於2018-01-23

什麼是NDK

Android NDK 是一組允許您將 C 或 C++(“原生程式碼”)嵌入到 Android 應用中的工具。

在 Android 應用中使用原生程式碼的應用場景

  • 在平臺之間移植其應用。
  • 重複使用現有庫,或者提供其自己的庫供重複使用。
  • 在某些情況下提高效能,特別是像遊戲這種計算密集型應用。

為 Android 構建原生應用時使用的主要元件

  • ndk-build:ndk-build 指令碼用於在 NDK 中心啟動構建指令碼。
    • 自動探測您的開發系統和應用專案檔案以確定要構建的內容。
    • 生成二進位制檔案。
    • 將二進位制檔案複製到應用的專案路徑。
  • Java:Android 構建過程從 Java 來源生成 .dex (Dalvik EXecutable) 檔案,這些檔案是 Android OS 在 Dalvik 虛擬機器(“DVM”)中執行的檔案。 即使您的應用根本未包含任何 Java 原始碼,構建過程仍會生成原生元件在其中執行的 .dex 可執行檔案。
  • 原生共享庫:NDK 從原生原始碼構建這些庫或 .so 檔案。
  • 原生靜態庫:NDK 也可構建靜態庫或 .a 檔案,您可以關聯到其他庫。
  • Java 原生介面 (JNI):JNI 是 Java 和 C++ 元件用以互相溝通的介面。
  • 應用二進位制介面 (ABI):ABI 可以非常精確地定義應用的機器程式碼在執行時如何與系統互動。 NDK 根據這些定義構建 .so 檔案。 不同的 ABI 對應不同的架構:NDK 包含對 ARMEABI(預設)、MIPS 和 x86 的 ABI 支援。
  • 清單:如果您要編寫沒有 Java 元件的應用,必須在清單中宣告 NativeActivity 類。

下面兩個專案僅在使用 ndk-build 指令碼構建時以及使用 ndk-gdb 指令碼除錯時才需要。

  • Android.mk:必須在 jni 資料夾內建立 Android.mk 配置檔案。 ndk-build 指令碼將檢視此檔案,其中定義了模組及其名稱、要編譯的原始檔、版本標誌以及要連結的庫。
  • Application.mk:此檔案列舉並描述您的應用需要的模組。 這些資訊包括:
    • 用於針對特定平臺進行編譯的 ABI。
    • 工具鏈。
    • 要包含的標準庫(靜態和動態 STLport 或預設系統)。

開發Android原生應用的一般流程

  1. 設計應用,確定要在 Java 中實現的部分,以及要以原生程式碼形式實現的部分。
  2. 像建立任何其他 Android 專案一樣建立一個 Android 應用專案。
  3. 在“JNI”目錄中建立一個描述原生庫的 Android.mk 檔案,包括名稱、標誌、連結庫和要編譯的原始檔。
  4. 或者,也可以建立一個配置目標 ABI、 工具鏈、發行/除錯模式和 STL 的 Application.mk 檔案。對於其中任何您未指明的專案,將分別使用以下預設值:
    • ABI:armeabi
    • 工具鏈:GCC 4.8
    • 模式:發行
    • STL:系統
  5. 將原生來源置於專案的 jni 目錄下。
  6. 使用 ndk-build 編譯原生(.so.a)庫。
  7. 構建 Java 元件,生成可執行 .dex 檔案。
  8. 將所有內容封裝到一個 APK 檔案中,包含 .so.dex 以及應用執行所需的其他檔案。###

Tips

  1. 本系列文章開發工具採用Android Studio
  2. 構建工具使用CMake,但是為了相容舊專案,會簡要介紹一下Android.mk檔案
  3. demo地址:https://github.com/cmder/ndkdemo.git

相關文章