Android.mk語法解析

什麼是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++語言那樣實現應用程序的一部分。
image.png

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 保留以下變量名:

  1. 以LOCAL_ 爲開頭的
  2. 以PRIVATE_ ,NDK_ 或者APP_ 開頭的名字。
  3. 小寫字母名字:如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

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