什麼是Android.mk
Android.mk是Android提供的一種makefile文件,用來指定諸如編譯生成so庫名、引用的頭文件目錄、需要編譯的.c/.cpp文件和.a靜態庫文件等。
Android.mk文件用來告知NDK Build系統關於Source的信息。 Android.mk將是GNU Makefile的一部分,且將被Build System解析一次或多次。
所以,請儘量少的在Android.mk中聲明變量,也不要假定任何東西不會在解析過程中定義。
什麼是NDK
Android NDK(Native Development Kit )是一套工具集合,允許你用像C/C++語言那樣實現應用程序的一部分。
Android.mk文件語法允許我們將Source打包成一個"modules". modules可以是:
1. 靜態庫
2. 動態庫
基本語法:
Simple example
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := hello-jni
LOCAL_SRC_FILES := hello-jni.c
include $(BUILD_SHARED_LIBRARY)
語法介紹
現在,讓我們解釋一下這些行。
LOCAL_PATH
LOCAL_PATH := $(call my-dir)
android.mk文件必須以本地路徑變量的定義開始。
它用於在開發樹中定位源文件。在本例中,由構建系統提供的宏函數’my dir’用於返回當前目錄的路徑(即包含android.mk文件本身的目錄)。
CLEAR_VARS
include $(CLEAR_VARS)
clear_vars變量由構建系統提供,並指向一個特殊的GNU makefile,它將爲您清除許多LOCAL_xxx變量。例如LOCAL_MODULE、OCAL_SRC_FILES、LOCAL_STATIC_LIBRARIES等),LOCAL_PATH除外。
這是必需的,因爲所有的構建控制文件在一個gnu make執行上下文中解析,其中所有變量都是全局的。
LOCAL_MODULE
LOCAL_MODULE := hello-jni
必須定義LOCAL_MODULE變量以標識您在android.mk中描述的每個模塊。
名稱必須是唯一且不包含任何空間。
請注意,構建系統將自動向相應生成的文件添加適當的前綴和後綴。換言之,名爲“foo”的共享庫模塊將生成“libfoo.so”。
如果您將模塊命名爲“libfoo”,則生成系統不會添加另一個“lib”前綴,也會生成libfoo.so。
LOCAL_SRC_FILES
LOCAL_SRC_FILES := hello-jni.c
LOCAL_SRC_FILES變量必須包含C和/或C++源文件的列表,這些文件將被構建並組裝到模塊中。
注意你應該這裏不列出頭文件和包含的文件,因爲構建系統將自動爲您計算依賴項;只列出源文件這將直接傳遞給編譯器。
注意,C++源文件的默認擴展名是“.CPP”。但是,可以通過定義變量LOCAL_CPP_EXTENSION來指定不同的變量本地擴展名。不要忘記初始點(即“.cxx”有效,而不是“cxx”)。
LOCAL_SRC_FILES
include $(BUILD_SHARED_LIBRARY)
BUILD_SHARED_LIBRARY是由構建系統提供的一個變量,它指向負責收集所有自最新“include$(clear_vars)”以來,您在本地變量中定義的信息,並確定要構建什麼以及如何構建。
當然還有BUILD_STATIC_LIBRARY來生成靜態庫。
具體的編譯變量列舉:
type | describe |
---|---|
BUILD_STATIC_LIBRARY | 編譯爲靜態庫。 |
BUILD_SHARED_LIBRARY | 編譯爲動態庫 |
BUILD_EXECUTABLE | 編譯爲Native C可執行程序 |
NDK語法變量彙總
NDK Build System 保留以下變量名:
- 以LOCAL_ 爲開頭的
- 以PRIVATE_ ,NDK_ 或者APP_ 開頭的名字。
- 小寫字母名字:如my-dir
如果想要定義自己在Android.mk中使用的變量名,建議添加MY_前綴。
type | example | describ |
---|---|---|
CLEAR_VARS | include $(CLEAR_VARS) | 必須在新模塊前包含之 |
BUILD_SHARED_LIBRARY | include $(BUILD_SHARED_LIBRARY) | 決定如何將你列出的Source編譯成一個動態庫 |
BUILD_STATIC_LIBRARY | include $(BUILD_STATIC_LIBRARY) | 決定如何將你列出的Source編譯成一個靜態庫 |
BUILD_EXECUTABLE | 決定如何將你列出的Source編譯成一個可執行Native程序 | include $(BUILD_EXECUTABLE) |
PREBUILT_SHARED_LIBRARY | include $(PREBUILT_SHARED_LIBRARY) | 把這個共享庫聲明爲 “一個” 獨立的模塊 |
PREBUILT_STATIC_LIBRARY | include $(PREBUILT_STATIC_LIBRARY) | 把這個靜態庫庫聲明爲 “一個” 獨立的模塊 |
TARGET_ARCH | 目標CPU架構名 | |
TARGET_PLATFORM | 目標平臺的名字 | |
TARGET_ARCH_ABI | ||
LOCAL_C_INCLUDES | LOCAL_C_INCLUDES := sources/foo | 一個可選的path列表。 |
LOCAL_CFLAGS | LOCAL_CFLAGS += -I |
一個可選的設置,在編譯C/C++ source 時添加如Flags |
LOCAL_STATIC_LIBRARIES | 要鏈接到本模塊的靜態庫list | |
LOCAL_SHARED_LIBRARIES | 要鏈接到本模塊的動態庫 | |
LOCAL_LDLIBS | LOCAL_LDLIBS := -lz | 可以用它來添加系統庫 |
參考:
android編譯系統makefile(Android.mk)寫法
Android.mk 文件語法詳解
Android.mk