NDK 簡介(Java使用原生程式碼)
簡介
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 構建指令碼。