Android.mk語(yǔ)法解析

什么是Android.mk

Android.mk是Android提供的一種makefile文件,用來(lái)指定諸如編譯生成so庫(kù)名、引用的頭文件目錄、需要編譯的.c/.cpp文件和.a靜態(tài)庫(kù)文件等。

Android.mk文件用來(lái)告知NDK Build系統(tǒng)關(guān)于Source的信息。 Android.mk將是GNU Makefile的一部分,且將被Build System解析一次或多次。

所以,請(qǐng)盡量少的在Android.mk中聲明變量,也不要假定任何東西不會(huì)在解析過(guò)程中定義。

什么是NDK

Android NDK(Native Development Kit )是一套工具集合,允許你用像C/C++語(yǔ)言那樣實(shí)現(xiàn)應(yīng)用程序的一部分。


image.png

Android.mk文件語(yǔ)法允許我們將Source打包成一個(gè)"modules". modules可以是:
1. 靜態(tài)庫(kù)
2. 動(dòng)態(tài)庫(kù)

基本語(yǔ)法:
Simple example

   LOCAL_PATH := $(call my-dir)

   include $(CLEAR_VARS)

   LOCAL_MODULE    := hello-jni
   LOCAL_SRC_FILES := hello-jni.c

   include $(BUILD_SHARED_LIBRARY)

語(yǔ)法介紹

現(xiàn)在,讓我們解釋一下這些行。

LOCAL_PATH

   LOCAL_PATH := $(call my-dir)

android.mk文件必須以本地路徑變量的定義開(kāi)始。
它用于在開(kāi)發(fā)樹(shù)中定位源文件。在本例中,由構(gòu)建系統(tǒng)提供的宏函數(shù)'my dir'用于返回當(dāng)前目錄的路徑(即包含android.mk文件本身的目錄)。

CLEAR_VARS

 include $(CLEAR_VARS)

clear_vars變量由構(gòu)建系統(tǒng)提供,并指向一個(gè)特殊的GNU makefile,它將為您清除許多LOCAL_xxx變量。例如LOCAL_MODULE、OCAL_SRC_FILES、LOCAL_STATIC_LIBRARIES等),LOCAL_PATH除外。

這是必需的,因?yàn)樗械臉?gòu)建控制文件在一個(gè)gnu make執(zhí)行上下文中解析,其中所有變量都是全局的。

LOCAL_MODULE

 LOCAL_MODULE := hello-jni

必須定義LOCAL_MODULE變量以標(biāo)識(shí)您在android.mk中描述的每個(gè)模塊。

名稱(chēng)必須是唯一且不包含任何空間。

請(qǐng)注意,構(gòu)建系統(tǒng)將自動(dòng)向相應(yīng)生成的文件添加適當(dāng)?shù)那熬Y和后綴。換言之,名為“foo”的共享庫(kù)模塊將生成“l(fā)ibfoo.so”。

如果您將模塊命名為“l(fā)ibfoo”,則生成系統(tǒng)不會(huì)添加另一個(gè)“l(fā)ib”前綴,也會(huì)生成libfoo.so。

LOCAL_SRC_FILES

  LOCAL_SRC_FILES := hello-jni.c

LOCAL_SRC_FILES變量必須包含C和/或C++源文件的列表,這些文件將被構(gòu)建并組裝到模塊中。

注意你應(yīng)該這里不列出頭文件和包含的文件,因?yàn)闃?gòu)建系統(tǒng)將自動(dòng)為您計(jì)算依賴(lài)項(xiàng);只列出源文件這將直接傳遞給編譯器。

注意,C++源文件的默認(rèn)擴(kuò)展名是“.CPP”。但是,可以通過(guò)定義變量LOCAL_CPP_EXTENSION來(lái)指定不同的變量本地?cái)U(kuò)展名。不要忘記初始點(diǎn)(即“.cxx”有效,而不是“cxx”)。

LOCAL_SRC_FILES

 include $(BUILD_SHARED_LIBRARY)

BUILD_SHARED_LIBRARY是由構(gòu)建系統(tǒng)提供的一個(gè)變量,它指向負(fù)責(zé)收集所有自最新“include$(clear_vars)”以來(lái),您在本地變量中定義的信息,并確定要構(gòu)建什么以及如何構(gòu)建。

當(dāng)然還有BUILD_STATIC_LIBRARY來(lái)生成靜態(tài)庫(kù)。

具體的編譯變量列舉:

type describe
BUILD_STATIC_LIBRARY 編譯為靜態(tài)庫(kù)。
BUILD_SHARED_LIBRARY 編譯為動(dòng)態(tài)庫(kù)
BUILD_EXECUTABLE 編譯為Native C可執(zhí)行程序

NDK語(yǔ)法變量匯總

NDK Build System 保留以下變量名:

  1. 以LOCAL_ 為開(kāi)頭的
  2. 以PRIVATE_ ,NDK_ 或者APP_ 開(kāi)頭的名字。
  3. 小寫(xiě)字母名字:如my-dir

如果想要定義自己在Android.mk中使用的變量名,建議添加MY_前綴。

type example describ
CLEAR_VARS include $(CLEAR_VARS) 必須在新模塊前包含之
BUILD_SHARED_LIBRARY include $(BUILD_SHARED_LIBRARY) 決定如何將你列出的Source編譯成一個(gè)動(dòng)態(tài)庫(kù)
BUILD_STATIC_LIBRARY include $(BUILD_STATIC_LIBRARY) 決定如何將你列出的Source編譯成一個(gè)靜態(tài)庫(kù)
BUILD_EXECUTABLE 決定如何將你列出的Source編譯成一個(gè)可執(zhí)行Native程序 include $(BUILD_EXECUTABLE)
PREBUILT_SHARED_LIBRARY include $(PREBUILT_SHARED_LIBRARY) 把這個(gè)共享庫(kù)聲明為 “一個(gè)” 獨(dú)立的模塊
PREBUILT_STATIC_LIBRARY include $(PREBUILT_STATIC_LIBRARY) 把這個(gè)靜態(tài)庫(kù)庫(kù)聲明為 “一個(gè)” 獨(dú)立的模塊
TARGET_ARCH 目標(biāo)CPU架構(gòu)名
TARGET_PLATFORM 目標(biāo)平臺(tái)的名字
TARGET_ARCH_ABI
LOCAL_C_INCLUDES LOCAL_C_INCLUDES := sources/foo 一個(gè)可選的path列表。
LOCAL_CFLAGS LOCAL_CFLAGS += -I<path> 一個(gè)可選的設(shè)置,在編譯C/C++ source 時(shí)添加如Flags
LOCAL_STATIC_LIBRARIES 要鏈接到本模塊的靜態(tài)庫(kù)list
LOCAL_SHARED_LIBRARIES 要鏈接到本模塊的動(dòng)態(tài)庫(kù)
LOCAL_LDLIBS LOCAL_LDLIBS := -lz 可以用它來(lái)添加系統(tǒng)庫(kù)

參考:
android編譯系統(tǒng)makefile(Android.mk)寫(xiě)法
Android.mk 文件語(yǔ)法詳解
Android.mk

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容