什麼是NDK
Android NDK 是一組容許您將 C 或 C++(「原生代碼」)嵌入到 Android 應用中的工具。html
在 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
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