Android_mk簡介

一. Android.mk介紹
Android.mk是Android提供的一種makefile文件肩钠,是GNU Makefile的一小部分,用來對(duì)Android程序進(jìn)行編譯兽间,指定諸如編譯生成so庫名历葛、引用的頭文件目錄、需要編譯的.c/.cpp文件和.a靜態(tài)庫文件渡八;因?yàn)樗械木幾g文件都在同一個(gè) GNU MAKE 執(zhí)行環(huán)境中進(jìn)行執(zhí)行啃洋,而Android.mk中所有的變量都是全局的传货。因此,您應(yīng)盡量少聲明變量宏娄,不要認(rèn)為某些變量在解析過程中不會(huì)被定義问裕。

它的基本格式如下:

1. LOCAL_PATH := $(call my-dir)  
2. include $(CLEAR_VARS)  
3.  ................  
4.  LOCAL_xxx       := xxx  
5.  LOCAL_MODULE    := hello-jni  
6.  LOCAL_SRC_FILES := hello-jni.c  
7.  LOCAL_xxx       := xxx  
8.  ................  
9.  include $(BUILD_SHARED_LIBRARY)

LOCAL_PATH變量制定了該.mk的路徑,$(call my-dir)調(diào)用NDK內(nèi)部的函數(shù)獲得當(dāng)前.mk文件的路徑
include $(CLEAR_VARS)清空了除了LOCAL_PATH之外的所有LOCAL_xxx變量的值
省略號(hào)中間就是對(duì)于模塊參數(shù)的設(shè)置孵坚,主要包括:模塊名字粮宛、模塊源文件、模塊類型卖宠、編譯好的模塊存放位置巍杈、以及編譯的平臺(tái)等
include $(BUILD_xxx_xxx)執(zhí)行NDK的默認(rèn)腳本,它會(huì)收include $(CLEAR_VARS)腳本后所有定義的LOCAL_xxx變量扛伍,然后根據(jù)它們來生成模塊筷畦。

二.Android.mk語法詳解

LOCAL_PATH := $(call my-dir)

每個(gè)Android.mk文件必須以定義LOCAL_PATH為開始。它用于在開發(fā)tree中查找源文件刺洒。宏my-dir 則由Build System提供鳖宾。返回包含Android.mk的目錄路徑。

include $(CLEAR_VARS)

CLEAR_VARS 變量由Build System提供逆航。并指向一個(gè)指定的GNU Makefile鼎文,由它負(fù)責(zé)清理很多LOCAL_xxx.
例如:LOCAL_MODULE, LOCAL_SRC_FILES, LOCAL_STATIC_LIBRARIES等等。但不清理LOCAL_PATH.
這個(gè)清理動(dòng)作是必須的因俐,因?yàn)樗械木幾g控制文件由同一個(gè)GNU Make解析和執(zhí)行拇惋,其變量是全局的。所以清理后才能避免相互影響抹剩。

LOCAL_MODULE := hello-jni

LOCAL_MODULE模塊必須定義撑帖,以表示Android.mk中的每一個(gè)模塊。名字必須唯一且不包含空格澳眷。Build System會(huì)自動(dòng)添加適當(dāng)?shù)那熬Y和后綴磷仰。例如,foo境蔼,要產(chǎn)生動(dòng)態(tài)庫灶平,則生成libfoo.so. 但請(qǐng)注意:如果模塊名被定為:libfoo.則生成libfoo.so. 不再加前綴

LOCAL_MODULE_PATH :=$(TARGET_ROOT_OUT) 指定最后生成的模塊的目標(biāo)地址

1.TARGET_ROOT_OUT:根文件系統(tǒng),路徑為out/target/product/generic/root
2.TARGET_OUT:system文件系統(tǒng)箍土,路徑為out/target/product/generic/system
3.TARGET_OUT_DATA:data文件系統(tǒng)逢享,路徑為out/target/product/generic/data

除了上面的這些,NDK還提供了很多其他的TARGET_XXX_XXX變量吴藻,用于將生成的模塊拷貝到輸出目錄的不同路徑
默認(rèn)是TARGET_OUT

LOCAL_SRC_FILES := hello-jni.c

LOCAL_SRC_FILES變量必須包含將要打包如模塊的C/C++ 源碼瞒爬。不必列出頭文件,build System 會(huì)自動(dòng)幫我們找出依賴文件。缺省的C++源碼的擴(kuò)展名為.cpp. 也可以修改侧但,通過LOCAL_CPP_EXTENSION

include $(BUILD_SHARED_LIBRARY)

BUILD_SHARED_LIBRARY:是Build System提供的一個(gè)變量矢空,指向一個(gè)GNU Makefile Script。
它負(fù)責(zé)收集自從上次調(diào)用 include $(CLEAR_VARS) 后的所有LOCAL_XXX信息禀横。并決定編譯為什么屁药。

BUILD_STATIC_LIBRARY    :編譯為靜態(tài)庫。 
BUILD_SHARED_LIBRARY :編譯為動(dòng)態(tài)庫 
BUILD_EXECUTABLE           :編譯為Native C可執(zhí)行程序  
BUILD_PREBUILT                 :該模塊已經(jīng)預(yù)先編譯

NDK還定義了很多其他的BUILD_XXX_XXX變量柏锄,它們用來指定模塊的生成方式酿箭。
三、使用示例

1. 編譯靜態(tài)庫

1.  LOCAL_PATH := $(call my-dir)    
2.  include $(CLEAR_VARS)    
3.  LOCAL_MODULE = libhellos    
4.  LOCAL_CFLAGS = $(L_CFLAGS)    
5.  LOCAL_SRC_FILES = hellos.c    
6.  LOCAL_C_INCLUDES = $(INCLUDES)    
7.  LOCAL_SHARED_LIBRARIES := libcutils    
8.  LOCAL_COPY_HEADERS_TO := libhellos    
9.  LOCAL_COPY_HEADERS := hellos.h    
10.  include $(BUILD_STATIC_LIBRARY)    

2. 編譯動(dòng)態(tài)庫

1.  LOCAL_PATH := $(call my-dir)    
2.  include $(CLEAR_VARS)    
3.  LOCAL_MODULE = libhellod    
4.  LOCAL_CFLAGS = $(L_CFLAGS)    
5.  LOCAL_SRC_FILES = hellod.c    
6.  LOCAL_C_INCLUDES = $(INCLUDES)    
7.  LOCAL_SHARED_LIBRARIES := libcutils    
8.  LOCAL_COPY_HEADERS_TO := libhellod    
9.  LOCAL_COPY_HEADERS := hellod.h    
10.  include $(BUILD_SHARED_LIBRARY)    

3. 使用靜態(tài)庫

1.  LOCAL_PATH := $(call my-dir)    
2.  include $(CLEAR_VARS)    
3.  LOCAL_MODULE := hellos    
4.  LOCAL_STATIC_LIBRARIES := libhellos    
5.  LOCAL_SHARED_LIBRARIES :=    
6.  LOCAL_LDLIBS += -ldl    
7.  LOCAL_CFLAGS := $(L_CFLAGS)    
8.  LOCAL_SRC_FILES := mains.c    
9.  LOCAL_C_INCLUDES := $(INCLUDES)    
10.  include $(BUILD_EXECUTABLE)    

**4. 使用動(dòng)態(tài)庫 **

1.  LOCAL_PATH := $(call my-dir)    
2.  include $(CLEAR_VARS)    
3.  LOCAL_MODULE := hellod    
4.  LOCAL_MODULE_TAGS := debug    
5.  LOCAL_SHARED_LIBRARIES := libc libcutils libhellod    
6.  LOCAL_LDLIBS += -ldl    
7.  LOCAL_CFLAGS := $(L_CFLAGS)    
8.  LOCAL_SRC_FILES := maind.c    
9.  LOCAL_C_INCLUDES := $(INCLUDES)    
10.  include $(BUILD_EXECUTABLE)    

5. 拷貝文件到指定目錄

1.  LOCAL_PATH := $(call my-dir)  
2.  include $(CLEAR_VARS)  
3.  LOCAL_MODULE := bt_vendor.conf  
4.  LOCAL_MODULE_CLASS := ETC  
5.  LOCAL_MODULE_PATH := $(TARGET_OUT)/etc/bluetooth  
6.  LOCAL_MODULE_TAGS := eng  
7.  LOCAL_SRC_FILES := $(LOCAL_MODULE)  
8.  include $(BUILD_PREBUILT)  

6. 拷貝動(dòng)態(tài)庫到指定目錄

1.  LOCAL_PATH := $(call my-dir)  
2.  include $(CLEAR_VARS)  
3.  #the data or lib you want to copy  
4.  LOCAL_MODULE := libxxx.so  
5.  LOCAL_MODULE_CLASS := SHARED_LIBRARIES  
6.  LOCAL_MODULE_PATH := 
     $$(ANDROID_OUT_SHARED_LIBRARIES)  
7.  LOCAL_SRC_FILES := lib/$(LOCAL_MODULE )  
8.  OVERRIDE_BUILD_MODULE_PATH := 
     $(TARGET_OUT_INTERMEDIATE_LIBRARIES)  
9.  include $(BUILD_PREBUILT)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末趾娃,一起剝皮案震驚了整個(gè)濱河市缭嫡,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌抬闷,老刑警劉巖妇蛀,帶你破解...
    沈念sama閱讀 219,490評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異笤成,居然都是意外死亡讥耗,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門啼器,熙熙樓的掌柜王于貴愁眉苦臉地迎上來备蚓,“玉大人,你說我怎么就攤上這事〖瑁” “怎么了?”我有些...
    開封第一講書人閱讀 165,830評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵吗伤,是天一觀的道長珠移。 經(jīng)常有香客問我,道長塘砸,這世上最難降的妖魔是什么节仿? 我笑而不...
    開封第一講書人閱讀 58,957評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮掉蔬,結(jié)果婚禮上廊宪,老公的妹妹穿的比我還像新娘。我一直安慰自己女轿,他們只是感情好箭启,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,974評(píng)論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蛉迹,像睡著了一般傅寡。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,754評(píng)論 1 307
  • 那天荐操,我揣著相機(jī)與錄音芜抒,去河邊找鬼。 笑死托启,一個(gè)胖子當(dāng)著我的面吹牛宅倒,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播驾中,決...
    沈念sama閱讀 40,464評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼唉堪,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了肩民?” 一聲冷哼從身側(cè)響起唠亚,我...
    開封第一講書人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎持痰,沒想到半個(gè)月后灶搜,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,847評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡工窍,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,995評(píng)論 3 338
  • 正文 我和宋清朗相戀三年割卖,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片患雏。...
    茶點(diǎn)故事閱讀 40,137評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡鹏溯,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出淹仑,到底是詐尸還是另有隱情丙挽,我是刑警寧澤,帶...
    沈念sama閱讀 35,819評(píng)論 5 346
  • 正文 年R本政府宣布匀借,位于F島的核電站颜阐,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏吓肋。R本人自食惡果不足惜凳怨,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,482評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望是鬼。 院中可真熱鬧肤舞,春花似錦、人聲如沸均蜜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽兆龙。三九已至杖爽,卻和暖如春敲董,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背慰安。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評(píng)論 1 272
  • 我被黑心中介騙來泰國打工腋寨, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人化焕。 一個(gè)月前我還...
    沈念sama閱讀 48,409評(píng)論 3 373
  • 正文 我出身青樓萄窜,卻偏偏與公主長得像,于是被迫代替她去往敵國和親撒桨。 傳聞我的和親對(duì)象是個(gè)殘疾皇子查刻,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,086評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • Android.mk文件是GNU Makefile的一小部分,它用來對(duì)Android程序進(jìn)行編譯凤类。 因?yàn)樗械木幾g...
    forty_seven閱讀 1,236評(píng)論 0 3
  • Android mk NDK構(gòu)建系統(tǒng)預(yù)留了以下的變量穗泵,在自定義變量時(shí)注意不要跟這些系統(tǒng)變量沖突 以LOCAL_開頭...
    王小寶wy閱讀 1,376評(píng)論 0 0
  • 翻譯自docs/ANDROID-MK.html Indroduction 本篇文檔描述Andrid.mk編譯文件的...
    記得柒叁貳閱讀 17,366評(píng)論 0 15
  • Android.mk文件用來告知NDK Build 系統(tǒng)關(guān)于Source的信息。 Android.mk將是GNU ...
    IT小魔女的故事閱讀 753評(píng)論 0 3
  • 千萬不要扣分 她們對(duì)你好 是對(duì)當(dāng)時(shí)的那個(gè)你 你自己的一言一行再扣分 扣得多少分對(duì)應(yīng)相應(yīng)的待遇
    蘿卜兔子醬醬閱讀 218評(píng)論 0 0