ndk-build 學習筆記

# 必須以local_path 開頭
# 定位源文件
LOCAL_PATH := $(call my-dir)android

#引入clear-vars.mk文件,清除除local_path之外的其餘local_<name>變量
Include $(CLEAR_VARS)c++

# 每個原聲組件稱爲一個模塊,local_modul變量用來給模塊設定一個惟一名稱
LOCAL_MODULE := hello-jni
# hello-jni模塊會生成一個共享庫文件且構建系統會將它命名爲libhello-jni.so編程

# local_src_files用於創建和組裝這個模塊的源文件列表
LOCAL_SRC_FILES := hello-jni.c
# local_src_files 能夠包含用空格分開的多個源文件名api

# 一、構建共享庫
# 引入build-shared-library.mk文件,構建共享庫
inlcude $(BUILD_SHARED_LIBRARY)安全

# 二、構建多個共享庫
LOCAL_PATH := $(call my-dir)函數

# 模塊1
inlcude $(CLEAR_VARS)
LOCAL_MODULE := module1
LOCAL_SRC_FILES := module1.c
include $(BUILD_SHARED_LIBRARY)優化

# 模塊2
include $(CLEAR_VARS)
LOCAL_MODULE := moludle2
LOCAL_SRC_FILES := module2.c
#include $(BUILD_SHARED_LIBRARY)ui


# 三、構建靜態庫
LOCAL_PATH := $(call-dir)
#第三方庫
include $(CLEAR_VARS)
LOCAL_MODULE := avilib
LOCAL_SRC_FILES := avilib.c platform_posix.cthis

include $(BUILD_STATIC_LIBRARY)日誌

#原生模塊
include $(CLEAR_VARS)
LOCAL_MODULE := module
LOCAL_SRC_FILES := module.c

LOCAL_STATIC_LIBRARIES := avilib
include $(BUILD_SHARED_LIBRARY)

# 四、用共享庫共享通用模塊
# 將通用模塊做爲共享庫創建起來,而動態鏈接依賴模塊以便消除重複的副本

LOCAL_PATH := $(call my-dir)

# 第三方avi庫
include $(CLEAR_VARS)
LOCAL_MODULE := avilib
LOCAL_SRC_FILES := avilib.c platform_posix.c

include $(BUILD_SHARED_LIBRARY)
# 重點,構建共享庫,用於共享到原生模塊1,和模塊2

# 原生模塊1
include $(CLEAR_VARS)
LOCAL_MODULE := module1
LOCAL_SRC_FILES := module1.c

LOCLA_SHARED_LIBRARIES := avilib
# local_shared_libraries 而不是static
include $(BUILD_SHARED_LIBRARY)

# 原生模塊2
include $(CLEAR_VARS)
LOCAL_MODULE := module2
LOCAL_SRC_FILES := module2.c

LOCAL_SHARED_LIBRARIES := avilib

include $(BUILD_SHARED_LIBRARY)

# 五、在多個NDK項目間共享模塊
# 在如上mk腳本基礎上加入以下一行腳本
$(call import-module, transcode/avilib)
# 默認狀況下搜索<Android NDK>/sources 目錄下的目錄
# 添加環境變量NDK_MODULE_PATH 爲 transcode所在目錄
# 這樣就能夠搜索到transcode/avilib目錄,並找到目錄下的libavilib.so文件

# 六、用Prebuilt庫
# 依然須要一個Android.mk構建文檔
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := avilib
LOCAL_SRC_FILES := libavilib.so
include $(PREBUILT_SHARED_LIBRARY)

# local_src_files 指向了so庫
prebuilt_shared_library: 直接將so庫複製到libs目錄下
prebuilt_static_library: 靜態庫能夠像共享庫同樣被用做prebuilt庫

# 原生模塊
LOCAL_SHARED_LIBRARIES := avilib

# 七、構建獨立的可執行文件
include $(CLEAR_VARS)
LOCAL_MODULE := module
LOCAL_SRC_FILES := module.c
LOCAL_STATIC_LIBRARIES := avilib

include $(BUILD_EXECUTABLE)
# 使用build_executable 而不是 build_shared_library構建

# 八、其餘構建系統變量
#構建系統定義的變量:
#TARGET_ARCH: 目標cpu體系結構的名稱,例如arm
#TARGET_PLATFORM:目標Android平臺的名稱,例如android-3
#TARGET_ARCH_ABI:目標cpu體系結構和ABI的名稱,例如armeabi-v7a
#TARGET_ABI:目標平臺和ABI的串聯,例如 android-3-armeabi-v7a

# 可被定義爲模塊說明部分的變量
#LOCAL_MODULE_FILENAME: 能夠用來覆蓋LOCAL_MODULE的值
#LOCAL_CPP_EXTENSION:c++源文件的擴展名,默認爲.cpp,能夠指定多個
LOCAL_CPP_EXTENSION :=.cpp .cxx
#LOCAL_CPP_FEATURES: 用來指明模塊所依賴的具體c++特性,如RTTI,exceptions等
LOCAL_CPP_FEATURES := rtti
#LOCAL_C_INCLUDES:用於搜索頭文件, 默認爲NDK安裝目錄的相對路徑
LOCAL_C_INCLUDES := sources/shared-module
LOCAL_C_INCLUDES := $(LOCAL_PATH)/include
#LOCAL_CFLAGS: 編譯器標誌,在編譯c和c++源文件的時候會被傳送給編譯器
LOCAL_CFLAGS := -DNDEBUG -DPORT=1234
#LOCAL_CPP_FLAGS: 編譯器標誌,只在編譯c++源文件時傳送給編譯器
#LOCAL_WHOLE_STATIC_LIBRARIES: LOCAL_STATIC_LIBRARIES 的變體,用來指明應該被包含在生成的共享庫中的全部靜態庫內容
# 當幾個靜態庫之間有循環依賴時,LOCAL_WHOLE_STATIC_LIBRARIES頗有用

#LOCAL_LDLIBS: 連接標誌的可選列表,當對目標文件進行鏈接以生成輸出文件時,該標誌將被傳送給鏈接器。
LOCAL_LDFLAGS := -llog #要與Android NDK日誌庫連接

#LOCAL_ALLOW_UNDEFINED_SYMBOLS: 禁止在生成的文件中進行缺失符號檢查。
#LOCAL_ARM_MODE: arm 機器體系結構特有變量,用於指定要生成arm 仍是thumb指令,默認thumb
LOCAL_ARM_MODE := arm
# 能夠單獨用.arm 擴展名指定只在arm模式下構建特定文件
LOCAL_SRC_FILES := file1.c file2.c.arm
#LOCAL_ARM_NEON: arm 體系特有變量,用於指定源文件中應該使用的arm高級單指令流多數據流(SIMD , aka NEON) 內聯函數
LOCAL_ARM_NEON :=true
# 同上能夠單獨使用.neon擴展名指定特定文件
LOCAL_SRC_FILES := file1.c file2.c.neon
#LOCAL_DISABLE_NO_EXECUTE: 用來禁止 NX Bit安全特性
#LOCAL_EXPORT_CFLAGS: 該變量記錄一組編譯器標誌,這些標記會被添加到經過變量LOCAL_STATIC_LIBRARIES或LOCAL_SHARED_LIBRARIES 使用的本地模塊的其餘模塊的LOCAL_CFLAGS定義中

#LOCAL_EXPORT_CPPFLAGS:同上,僅用於C++特定代碼編譯器標識
#LOCAL_EXPORT_LDFLAGS:同LOCAL_EXPORT _CFLAGS, 但用做鏈接器標誌
#LOCAL_EXPORT_C_INCLUDES:該變量容許記錄路徑集
#LOCAL_SHORT_COMMANDS: 優化編譯 (一堆內容,看不懂)
#LOCAL_FILTER_ASM:用於過濾來自LOCAL_SRC_FILES變量的裝配文件的應用程序;

# 九、其餘構建系統函數宏
# all-subdir-makefiles: 返回當前目錄的全部子目錄的Android.mk構建文件列表。
include $(call all-subdir-makefiles)

# this-makefile: 返回當前Android.mk構建文件的路徑
# parent-makefile: 返回包含當前構建文件的父Android.mk構建文件的路徑
# grand-parent-makefile: 看名字嘍

# 十、定義新變量
# 以MY_開頭自定義變量
MY_SRC_FILES := avilib.c platform_posix.c
LOCAL_SRC_FILES := $(addprefix avilib/, $(MY_SRC_FILES))

# 十一、條件操做

ifeq ($(TARGET_ARCH), arm)
LOCAL_SRC_FILES += armonly.c
else
LOCAL_SRC_FILES += generic.c
endif

 

# Application.mk
#APP_MODULES: 覆蓋Android.mk中的模塊,並提供一個用空格分開的須要構建的模塊列表
#APP_OPTIM: 能夠爲release 或者 release模式生成二進制文件
#APP_CLAGS: 列出一些編譯器標識
#APP_CPPFLAGS: 同上,僅限於c++源文件
#APP_BUILD_SCRIPT: 默認狀況下,NDK 構建系統在jni子目錄下查找Android.mk文件,該變量能夠修改上述行爲
#APP_ABI: 能夠生成x86 mips等api二進制文件
#APP_STL: 默認狀況下,NDK使用最小STL運行庫,能夠旋轉stl
APP_STL := stlport_shared
#APP_GNUSTL_FORCE_CPP_FEATURES: 全部模塊都依賴於具體的c++特性, RTTI,exceptions等(類似於 LOCAL_CPP_EXTENSIONS)
#APP_SHORT_COMMANDS: 編譯優化(LOCAL_SHORT_COMMANDS)


# 使用ndk-build腳本
# -C 指定ndk的位置
ndk-build -C /path/to/the/project

# -B 強制從新構建
ndk-build -B

# clean
ndk-build clean

# 並行執行 -j
ndk-build -j 4

參考:《Android C++高級編程》 2.4.1 Android.mk 2.4.2 Application.mk 2.5 使用ndk-build 腳本

相關文章
相關標籤/搜索