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 構建腳本。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章