什麼是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原生應用的一般流程
- 設計應用,確定要在 Java 中實現的部分,以及要以原生程式碼形式實現的部分。
- 像建立任何其他 Android 專案一樣建立一個 Android 應用專案。
- 在“JNI”目錄中建立一個描述原生庫的
Android.mk
檔案,包括名稱、標誌、連結庫和要編譯的原始檔。 - 或者,也可以建立一個配置目標 ABI、 工具鏈、發行/除錯模式和 STL 的
Application.mk
檔案。對於其中任何您未指明的專案,將分別使用以下預設值:- ABI:armeabi
- 工具鏈:GCC 4.8
- 模式:發行
- STL:系統
- 將原生來源置於專案的
jni
目錄下。 - 使用 ndk-build 編譯原生(
.so
、.a
)庫。 - 構建 Java 元件,生成可執行
.dex
檔案。 - 將所有內容封裝到一個 APK 檔案中,包含
.so
、.dex
以及應用執行所需的其他檔案。###
Tips
- 本系列文章開發工具採用Android Studio
- 構建工具使用CMake,但是為了相容舊專案,會簡要介紹一下Android.mk檔案
- demo地址:https://github.com/cmder/ndkdemo.git