簡介
Native Development kit
原生開發工具包(NDK)是一組在 Android 應用中利用 C 和 C++ 代碼的工具。因爲 Java 無法直接調用 C 和 C++ 的代碼,想要在 Android 應用中使用原生代碼,NDK 便應運而生。
NDK 的核心目的之一是讓 C 和 C++ 源代碼構建爲可用於應用的共享庫。
工作方式
主要組件
- ndk-build : 此腳本用於在 NDK 中心啓動構建腳本。包含功能:
- 自動探測開發系統和應用項目文件以確定要構建的內容
- 生成二進制文件
- 講二進制文件複製到應用的項目路徑
- Java :
- 原生共享庫:NDK 從原生源代碼構建這些庫或
.so
文件 - 原生靜態庫:NDK 也可以構建靜態庫或
.a
文件 - Java 原生接口(JNI):JNI 是 Java 和 C++ 組件用以互相溝通的接口
- 應用二進制界面(ABI):定義應用的機器代碼在運行時如何與系統交互。NDK 根據這些定義構建
.so
文件。不同的 ABI 對應不同的架構 - 清單:如果應用沒有 Java 組件 ,必須在清單中聲明
NativeActivity
類 -
Android.mk
:必須在jni
文件夾內創建Android.mk
配置文件。ndk-build
腳本將查看此文件,其中定義了模塊及其名稱、要編譯的源文件、版本標誌以及要鏈接的庫。 -
Application.mk
:此文件枚舉並描述應用需要的模塊。包括: - 用於針對特定平臺進行編譯的 ABI
- 工具鏈
- 要包含的標準庫
構建
Android.mk
Android.mk
文件位於項目 jni/
目錄的子目錄中,用於向構建系統描述源文件和共享庫。定義 Application.mk
、構建系統和環境變量所未定義的項目範圍設置。
Android.mk
的語法用於將源文件分組爲模塊。模塊是靜態庫、共享庫或獨立可執行文件。
包含內容
-
必須首先定義
LOCAL_PATH
變量:# 表示源文件在開發樹種的位置。構建系統提供的宏函數 my-dir 將返回當前目錄(包含 Android.mk 文件本身的目錄) LOCAL_PATH := $(call my-dir)
-
CLEAR_VARS
指向特殊 GNU Makefile,在描述每個模塊之前,必須聲明此變量include $(CLEAR_VARS)
-
LOCAL_MODULE
存儲要構建的模塊的名稱。構建系統在生存最終共享庫文件時,會添加lib
前綴(模塊名不以lib開頭)和.so
後綴# 每個模塊名稱必須唯一,且不含任何空格。 LOCAL_MODULE := module-name
-
LOCAL_C_INCLUDES
指定相對於 NDK root 目錄的路徑列表,在編譯所有源文件時添加到 include 搜索路徑LOCAL_C_INCLUDES := xx/xx
-
LOCAL_SRC_FILES
包含要構建到模塊中的 C 或 C++ 源文件列表LOCAL_SRC_FILES :=
LOCAL_CFLAGS
爲構建系統設置在構建 C 和 C++ 源文件時要傳遞的編譯器標誌。LOCAL_STATIC_LIBRARIES
存儲當前模塊依賴的靜態模塊列表LOCAL_SHARED_LIBRARIES
此模塊在運行時依賴的共享庫模塊列表LOCAL_LDILIBS
包含在構建共享庫或可執行文件時要使用的其他鏈接器標誌列表-
BUILD_SHARED_LIBRARY
幫助系統將所有內容連接到一起# 指向 GNU Makefile 腳本,用於收集在 `LOCAL_XXX`變量中提供的所有相關信息,以及確定如何從列出的源文件構建目標共享庫。 include $(BUILD_SHARED_LIBRARY)
Application.mk
用於描述應用需要的原生模塊。模塊可以是靜態庫、共享庫或可執行文件。
變量
APP_ABI
可以使用APP_ABI
選擇不同的 ABI。默認情況下,NDK 構建系統爲armeabi
ABI 生成機器代碼。APP_PLATFORM
包含目標 Android 平臺的名稱。NDK_TOOLCHAIN_VERSION
選擇 GCC 編譯器的版本。
ndk-build
ndk-build
文件爲一個 shell 腳本,用途是調用正確的 NDK 構建腳本。