http://blog.csdn.net/ttxgz/article/details/7193099 用自己修改過的 framework/base/media/libstagefright/Android.mk做例子,,講得不對的大家扔雞蛋吧:
[html]
view plaincopy
其中第一行,是LOCAL_PATH的定義,。一個Android.mk file首先必須定義好LOCAL_PATH變量,。它用于在開發(fā)樹中查找源文件,。在這個例子中,,宏函數(shù)’my-dir’, 由編譯系統(tǒng)提供,,用于返回當前路徑(即包含Android.mk file文件的目錄)。 第二行,,是用于清除之前其他mk文件定義的全局變量,。例如LOCAL_SRC_FILE,就每個模塊都會定義一個,,這樣定義這些變量之前,,先清掉。但是這個函數(shù)不會清LOCAL_PATH,。
[html]
view plaincopy
LOCAL_SRC_FILES變量必須包含將要編譯打包進模塊中的C或C++源代碼文件,。注意,你不用在這里列出頭文件和包含文件,,因為編譯系統(tǒng)將會自動為你找出依賴型的文件,;僅僅列出直接傳遞給編譯器的源代碼文件就好,。
[html]
view plaincopy
所需要包含的頭文件路徑, 其中TOP代表android根目錄。JNI_H_INCLUDE 應該是 dalvik/libnativehelper/include,,這個可以從build/core/pathmap.mk看得出來。另外,,還有下面一些常用的路徑: TARGET_ROOT_OUT:表示根文件系統(tǒng),。 LOCAL_MODULE_PATH和LOCAL_UNSTRIPPED_PATH來指定最后的目標安裝路徑,。
[html]
view plaincopy
加入所需要鏈接的動態(tài)庫(*.so)的名稱
[html]
view plaincopy
所需要鏈接的靜態(tài)庫(*.a)的名稱
[html]
view plaincopy
繼續(xù)加入所需要鏈接的動態(tài)庫(*.so)的名稱 [html]
view plaincopy
[html]
view plaincopy
[html]
view plaincopy
加上靜態(tài)庫,。如果靜態(tài)庫沒有源碼,,是已經(jīng)編譯好的.a,那么這個變量一定加上來制定.a的路徑(-Lpath)和庫名(-lname,,name去掉前綴lib和后綴.a,,例如,這里的庫有l(wèi)ibstagefright_ccmp3dec.a),。否則,,如果只用了LOCAL_STASTIC_LIB, 在系統(tǒng)全部編譯的時候, 系統(tǒng)會去找源碼來編譯.a,,然后再去找.a 做依賴來編譯當前模塊,,找不到源碼,便報錯,。想系統(tǒng)直接找.a而不是找源碼,,就要加上這個變量。
[html]
view plaincopy
[html]
view plaincopy
其他: include $(BUILD_STATIC_LIBRARY) 表示編譯一個靜態(tài)庫,生成的文件放在out/target/product/generic/obj/STATIC_LIBRARY,,目標文件夾為:XXX_static_intermediates
[html]
view plaincopy
另外,附上常用模板: 1,,編譯應用程序的模板: 舉例如下: android庫文件的編譯(靜態(tài)庫和動態(tài)庫,,Android.mk)Android 系統(tǒng)下要編寫Android.mk來生成相應的庫文件已經(jīng)非常模板化了,。 //@Android.mk //靜態(tài)庫的編寫 LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) LOCAL_PRELINK_MODULE := false LOCAL_SRC_FILES:= / aa.c bb.c dd.c / LOCAL_SHARED_LIBRARIES := / dd ee ff / LOCAL_C_INCLUDES += / LOCAL_CFLAGS += -MD / -FF -Uarm -DMODULE -D__LINUX_ARM_ARCH__=7 / LOCAL_MODULE:= libMyStaticLib include $(BUILD_STATIC_LIBRARY) //靜態(tài)庫生成后的文件是libMyStaticLib.a //@Android.mk //動態(tài)庫的編寫 LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) LOCAL_PRELINK_MODULE := false LOCAL_SRC_FILES:= / aa.c bb.c dd.c / LOCAL_SHARED_LIBRARIES := / dd ee ff / LOCAL_C_INCLUDES += / LOCAL_CFLAGS += -MD / -FF -Uarm -DMODULE -D__LINUX_ARM_ARCH__=7 / LOCAL_MODULE:= libMyShareLib include $(BUILD_SHARED_LIBRARY) //動態(tài)庫生成后的文件是libMyShareLib.so 以上部分來自http://blog.csdn.net/zhandoushi1982/article/details/5316669 ----------------------------------------------------------------------------------------------------------------------------------------------------------------- http://blog.csdn.net/stefzeus/article/details/6597143 Android.mk的用法|靜態(tài)庫|動態(tài)庫一個Android.mk file用來向編譯系統(tǒng)描述你的源代碼。編譯系統(tǒng)為你處理許多細節(jié)問題,。例如,,你不需要在你的Android.mk中列出頭文件和依賴文件,NDK編譯系統(tǒng)將會為你自動處理這些問題,。在升級NDK后,,你應該得到新的toolchain/platform支持,而且不需要改變你的Android.mk文件,。 先看一個簡單的例子:一個簡單的"hello world",,比如下面的文件: sources/helloworld/helloworld.csources/helloworld/Android.mk 相應的Android.mk文件會象下面這樣: LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := helloworld LOCAL_SRC_FILES := helloworld.c include $(BUILD_SHARED_LIBRARY) 我們來解釋一下這幾行代碼:(1)LOCAL_PATH := $(call my-dir) 一個Android.mk file首先必須定義好LOCAL_PATH變量。它用于在開發(fā)樹中查找源文件,。在這個例子中,,宏函數(shù)’my-dir’, 由編譯系統(tǒng)提供,用于返回當前路徑(即包含Android.mk file文件的目錄),。 (2)include $( CLEAR_VARS) CLEAR_VARS 由編譯系統(tǒng)提供,,指定讓GNU MAKEFILE為你清除許多LOCAL_XXX變量(例如 LOCAL_MODULE, LOCAL_SRC_FILES, LOCAL_STATIC_LIBRARIES, 等等...),除LOCAL_PATH 。這是必要的,,因為所有的編譯控制文件都在同一個GNU MAKE執(zhí)行環(huán)境中,,所有的變量都是全局的。 (3)LOCAL_MODULE := helloworld LOCAL_MODULE變量必須定義,,以標識你在Android.mk文件中描述的每個模塊,。名稱必須是唯一的,而且不包含任何空格,。注意編譯系統(tǒng)會自動產(chǎn)生合適的前綴和后綴,,換句話說,一個被命名為'foo'的共享庫模塊,,將會生成'libfoo.so'文件,。 (4)LOCAL_SRC_FILES := helloworld.c LOCAL_SRC_FILES變量必須包含將要編譯打包進模塊中的C或C++源代碼文件。注意,,你不用在這里列出頭文件和包含文件,,因為編譯系統(tǒng)將會自動為你找出依賴型的文件;僅僅列出直接傳遞給編譯器的源代碼文件就好。 在Android中增加本地程序或者庫,,這些程序和庫與其所載路徑?jīng)]有任何關系,,只和它們的Android.mk文件有關系。Android.mk和普通的Makefile有所不同,,它具有統(tǒng)一的寫法,,主要包含一些系統(tǒng)公共的宏。 在一個Android.mk中可以生成多個可執(zhí)行程序,、動態(tài)庫和靜態(tài)庫,。 1.編譯應用程序的模板:#Test Exe LOCAL_PATH := $(call my-dir) #include $(CLEAR_VARS) LOCAL_SRC_FILES:= main.c LOCAL_MODULE:= test_exe #LOCAL_C_INCLUDES := #LOCAL_STATIC_LIBRARIES := #LOCAL_SHARED_LIBRARIES := include $(BUILD_EXECUTABLE) (菜鳥級別解釋::=是賦值的意思,$是引用某變量的值)LOCAL_SRC_FILES中加入源文件路徑,,LOCAL_C_INCLUDES 中加入所需要包含的頭文件路徑,LOCAL_STATIC_LIBRARIES加入所需要鏈接的靜態(tài)庫(*.a)的名稱,,LOCAL_SHARED_LIBRARIES中加入所需要鏈接的動態(tài)庫(*.so)的名稱,,LOCAL_MODULE表示模塊最終的名稱,BUILD_EXECUTABLE表示以一個可執(zhí)行程序的方式進行編譯,。 2.編譯靜態(tài)庫的模板:#Test Static Lib LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_SRC_FILES:= / helloworld.c LOCAL_MODULE:= libtest_static #LOCAL_C_INCLUDES := #LOCAL_STATIC_LIBRARIES := #LOCAL_SHARED_LIBRARIES := include $(BUILD_STATIC_LIBRARY) 一般的和上面相似,,BUILD_STATIC_LIBRARY表示編譯一個靜態(tài)庫. 3.編譯動態(tài)庫的模板:#Test Shared Lib LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_SRC_FILES:= / helloworld.c LOCAL_MODULE:= libtest_shared TARGET_PRELINK_MODULES := false #LOCAL_C_INCLUDES := #LOCAL_STATIC_LIBRARIES := #LOCAL_SHARED_LIBRARIES := include $(BUILD_SHARED_LIBRARY) 一般的和上面相似,BUILD_SHARED_LIBRARY表示編譯一個靜態(tài)庫,。 以上三者的生成結果分別在如下,,generic依具體target會變: out/target/product/generic/obj/STATIC_LIBRARY out/target/product/generic/obj/SHARED_LIBRARY 每個模塊的目標文件夾分別為: 可執(zhí)行程序:XXX_intermediates 另外,在Android.mk文件中,,還可以指定最后的目標安裝路徑, TARGET_OUT:表示system文件系統(tǒng),。 TARGET_OUT_DATA:表示data文件系統(tǒng),。 用法如: CAL_MODULE_PATH:=$(TARGET_ROOT_OUT) |
|
來自: 清凈明誨 > 《Android開發(fā)》