版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、Introduction:Android.mk 編譯文件是用來向 Android NDK 描述你的 C,C+ 源代碼文件的, 這篇文檔描 述了它的語法。在閱讀下面的內(nèi)容之前,假定你已經(jīng)閱讀了 docs/OVERVIEW.TXT 文件,了解 了它們的腳色和用途。一、概述一個(gè) Android.mk file 用來向編譯系統(tǒng)描述你的源代碼。具體來說:(1) 該文件是 GNU Makefile 的一小部分,會被編譯系統(tǒng)解析一次或更多次的 build 系統(tǒng)。 因此,您應(yīng)盡量減少您聲明的變量,不要認(rèn)為某些變量在解析過程中不會被定義。(2) 這個(gè)文件的語法允許把你的源代碼組織成模塊,一個(gè)模塊屬下列類型之一:
2、1) 靜態(tài)庫 2) 共享庫,且只有共享庫將被安裝 /復(fù)制到您的應(yīng)用軟件包,雖然靜態(tài)庫能被 用于生成共享庫。你可以在每一個(gè) Android.mk file 中定義一個(gè)或多個(gè)模塊,你也可以在幾個(gè)模塊中使用同一 個(gè)源代碼文件。(1) 編譯系統(tǒng)為你處理許多細(xì)節(jié)問題。例如,你不需要在你的 Android.mk 中列出頭文件和 依賴文件。 NDK 編譯系統(tǒng)將會為你自動處理這些問題。這也意味著,在升級 NDK 后,你應(yīng)該 得到新的 toolchain/platform 支持,而且不需要改變你的 Android.mk 文件。注意,這個(gè)語法同公開發(fā)布的 Android 平臺的開源代碼很接近,然而編譯系統(tǒng)實(shí)現(xiàn)他們
3、的 方式卻是不同的,這是故意這樣設(shè)計(jì)的,可以讓程序開發(fā)人員重用外部庫的源代碼更容易。在描述語法細(xì)節(jié)之前,咱們來看一個(gè)簡單的hello world 的例子,比如,下面的文件:sources/helloworld/helloworld.csources/helloworld/Android.mkhelloworld.c 是一個(gè) JNI 共享庫,實(shí)現(xiàn)返回 hello world 字符串的原生方法。相應(yīng)的 Android.mk 文件會象下面這樣:LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE:= helloworldLOCAL
4、_SRC_FILES := helloworld.cinclude $(BUILD_SHARED_LIBRARY)好,我們來解釋一下這幾行代碼:LOCAL_PATH := $(call my-dir)一個(gè) Android.mk file 首先必須定義好 LOCAL_PATH 變量。它用于在開發(fā)樹中查找源文 件。在這個(gè)例子中,宏函數(shù) m-ydir 由, 編譯系統(tǒng)提供,用于返回當(dāng)前路徑 (即包含 Android.mk file 文件的目錄 ) 。include $( CLEAR_VARS)CLEAR_VARS 由編譯系統(tǒng)提供,指定讓 GNU MAKEFILE 為你清除許多 LOCAL_XXX 變量
5、 (例如 LOCAL_MODULE,LOCAL_SRC_FILES, LOCAL_STATIC_LIBRARIES,等等 .),除 LOCAL_PATH 。這是必要的,因?yàn)樗械木幾g控制文件都在同一個(gè) GNU MAKE 執(zhí)行環(huán)境中,所有的變量都是全局的。LOCAL_MODULE := helloworldLOCAL_MODULE 變量必須定義,以標(biāo)識你在 Android.mk 文件中描述的每個(gè)模塊。名稱 必須是唯一的,而且不包含任何空格。注意編譯系統(tǒng)會自動產(chǎn)生合適的前綴和后綴,換句話 說,一個(gè)被命名為 foo的共享庫模塊,將會生成 libfoo.so 文件。重要注意事項(xiàng):如果你把庫命名為 li
6、bhelloworld ,編譯系統(tǒng)將不會添加任何的 lib 前綴, 也會生成 libhelloworld.so ,這是為了支持來源于 Android 平臺的源代碼的 Android.mk 文件,如 果你確實(shí)需要這么做的話。LOCAL_SRC_FILES := helloworld.cLOCAL_SRC_FILES 變量必須包含將要編譯打包進(jìn)模塊中的 C 或 C+ 源代碼文件。注 意,你不用在這里列出頭文件和包含文件,因?yàn)榫幾g系統(tǒng)將會自動為你找出依賴型的文件;僅僅列出直接傳遞給編譯器的源代碼文件就好。【注意,默認(rèn)的C+源碼文件的擴(kuò)展名是 .cpp 指定一個(gè)不同的擴(kuò)展名也是可能的,只要定義 LOC
7、AL_DEFAULT_CPP_EXTENSION 變量, 不要忘記開始的小圓點(diǎn) (也就是定義為 .cxx 而不,是 cxx 當(dāng))(然這一步我們一般不會去改它 )】include $(BUILD_SHARED_LIBRARY)BUILD_SHARED_LIBRARY 是編譯系統(tǒng)提供的變量,指向一個(gè) GNU Makefile 腳本 ( 應(yīng)該 就是在 build/core 目錄下的 shared_library.mk) ,負(fù)責(zé)收集自從上次調(diào)用 include $(CLEAR_VARS) 以來,定義在 LOCAL_XXX 變量中的所有信息,并且決定編譯什么,如何 正確地去做。并根據(jù)其規(guī)則生成靜態(tài)庫。同
8、理對于靜態(tài)庫。在 sources/samples 目錄下有更復(fù)雜一點(diǎn)的例子,寫有注釋的 Android.mk 文件,你可以看 看。、參考這是一份你應(yīng)該在 Android.mk 中依賴或定義的變量列表,您可以定義其他變量為自己使 用,但是 NDK 編譯系統(tǒng)保留下列變量名:-以 LOCAL_ 開頭的名字 (例如 LOCAL_MODULE)-以 PRIVATE_, NDK_ or APP_ 開頭的名字 ( 內(nèi)部使用 )-小寫名字 ( 內(nèi)部使用,例如 m-ydir )如果您為了方便在 Android.mk 中定義自己的變量,我們建議使用 MY_ 前綴,一個(gè)小例 子:MY_SOURCES := foo.
9、cifneq ($(MY_CONFIG_BAR),)endifLOCAL_SRC_FILES += $(MY_SOURCES)1. GNU Make 變量這些 GNU Make 變量在你的 Android.mk 文件解析之前,就由編譯系統(tǒng)定義好了。注意在 某些情況下, NDK 可能分析 Android.mk 幾次,每一次某些變量的定義會有不同。(1) CLEAR_VARS: 指向一個(gè)編譯腳本,幾乎所有未定義的 LOCAL_XXX 變量都在 Module-description 節(jié)中列出。你必須在開始一個(gè)新模塊之前包含這個(gè)腳本。 include $(CLEAR_VARS)(2) BUILD_SH
10、ARED_LIBRARY: 指向編譯腳本,收集所有的你在 LOCAL_XXX 變量中提 供的信息,并且決定如何把你列出的源代碼文件編譯成一個(gè)共享庫。注意,你必須至少在包含 這個(gè)文件之前定義 LOCAL_MODULE 和 LOCAL_SRC_FILES ,使用例子:include $(BUILD_SHARED_LIBRARY) ( 注意這將生成一個(gè)名為 lib$(LOCAL_MODULE).so 的文件 )(3) BUILD_STATIC_LIBRARY: 一個(gè) BUILD_SHARED_LIBRARY 變量用于編譯一個(gè)靜態(tài) 庫。靜態(tài)庫不會復(fù)制到你的 project/packages 中,但是能
11、夠用于編譯共享庫, ( 看下面描述的 LOCAL_STATIC_LIBRARIES and LOCAL_STATIC_WHOLE_LIBRARIES)使用例子: include $(BUILD_STATIC_LIBRARY) ( 注意,這將會生成一個(gè)名為 lib$(LOCAL_MODULE).a 的文件 )。(4) TARGET_ARCH: 目標(biāo) CPU 平臺的名字 , 和 android 開放源碼中指定的那樣。如果是 arm,表示要生成 ARM 兼容的指令,與 CPU 架構(gòu)的修訂版無關(guān)。(5) TARGET_PLATFORM: Android.mk 解析的時(shí)候,目標(biāo) Android 平臺的名
12、字 .詳情可參考 /development/ndk/docs/stable- apis.txt.android-3 - Official Android 1.5 system imagesandroid-4 - Official Android 1.6 system imagesandroid-5 - Official Android 2.0 system images(6) TARGET_ARCH_ABI: 暫時(shí)只支持兩個(gè) value,armeabi和 armeabi-v7a。在現(xiàn)在的版本 中一般把這兩個(gè)值簡單的定義為 arm,通過 android 平臺內(nèi)部對它重定義來獲得更好的匹配。 其他
13、的 ABI 將在以后的 NDK 版本中介紹,它們會有不同的名字。注意所有基于 ARM 的 ABI 都會把 TARGET_ARCH 定義成 arm,但是會有不同的 TARGET_ARCH_ABI(7) TARGET_ABI: 目標(biāo)平臺和 ABI 的組合,它事實(shí)上被定義成 $(TARGET_PLATFORM)- $(TARGET_ARCH_ABI) 在你想要在真實(shí)的設(shè)備中針對一個(gè)特別的目標(biāo)系統(tǒng)進(jìn)行測試時(shí),會有 用。在默認(rèn)的情況下,它會是 android-3-arm 。 2. 模塊描述變量下面的變量用于向編譯系統(tǒng)描述你的模塊。你應(yīng)該定義在include $(CLEAR_VARS) 和include
14、$(BUILD_XXXXX) 之間。正如前面描寫的那樣, $(CLEAR_VARS 是一個(gè)腳本,清除 所有這些變量,除非在描述中顯式注明。(1) LOCAL_PATH: 這個(gè)變量用于給出當(dāng)前文件的路徑。你必須在 Android.mk 的開頭定 義,可以這樣使用:LOCAL_PATH := $(call my-dir)這個(gè)變量不會被 $(CLEAR_VARS) 清除,因此每個(gè) Android.mk 只需要定義一次 (即使你在 一個(gè)文件中定義了幾個(gè)模塊的情況下 )。(2) LOCAL_MODULE: 這是你模塊的名字,它必須是唯一的,而且不能包含空格。你必 須在包含任一的 $(BUILD_XXXX
15、) 腳本之前定義它。模塊的名字決定了生成文件的名字,例 如,如果一個(gè)一個(gè)共享庫模塊的名字是,那么生成文件的名字就是lib.so。但是,在你的 NDK生成文件中 (或者 Android.mk 或者 Application.mk) ,你應(yīng)該只涉及 (引用 )有正常名字的其他模 塊。(3) LOCAL_SRC_FILES: 這是要編譯的源代碼文件列表。只要列出要傳遞給編譯器的文件,因?yàn)榫幾g系統(tǒng)自動為你計(jì)算依賴。注意源代碼文件名稱都是相對于 可以使用路徑部分,例如:LOCAL_PATH 的,你LOCAL_SRC_FILES := foo.ctoto/bar.c注意:在生成文件中都要使用理。UNIX 風(fēng)
16、格的斜杠 (/).windows風(fēng)格的反斜杠不會被正確的處(4) LOCAL_CPP_EXTENSION: 認(rèn)是 .cpp,但是你可以改變它,比如:這是一個(gè)可選變量,用來指定C+代碼文件的擴(kuò)展名,默LOCAL_CPP_EXTENSION := .cxx(5) LOCAL_C_INCLUDES : 路徑的可選配置,是從根目錄開始的,all sources (C, C+ and Assembly). For example:LOCAL_C_INCLUDES := sources/fooOr even:LOCAL_C_INCLUDES := $(LOCAL_PATH)/./foo需要在任何包含 LO
17、CAL_CFLAGS / LOCAL_CPPFLAGS 標(biāo)志之前。(6) LOCAL_CFLAGS: 可選的編譯器選項(xiàng),在編譯 C 代碼文件的時(shí)候使用。這可能是有用 的,指定一個(gè)附加的包含路徑 (相對于 NDK 的頂層目錄 ),宏定義,或者編譯選項(xiàng)。重要信息:不要在 Android.mk 中改變 optimization/debugging 級別,只要在 Application.mk 中指定合適的信息,就會自動地為你處理這個(gè)問題,在調(diào)試期間,會讓 NDK 自動生成有用的數(shù)據(jù)文件。 (7) LOCAL_CXXFLAGS: Same as LOCAL_CFLAGS for C+ source fi
18、les(8) LOCAL_CPPFLAGS: 與 LOCAL_CFLAGS 相同,但是對 C 和 C+ source files 都適 用。(9) LOCAL_STATIC_LIBRARIES: 應(yīng)該鏈接到這個(gè)模塊的靜態(tài)庫列表 (使用 BUILD_STATIC_LIBRARY 生成 ),這僅僅對共享庫模塊才有意義。(10) LOCAL_SHARED_LIBRARIES: 這個(gè)模塊在運(yùn)行時(shí)要依賴的共享庫模塊列表,在鏈 接時(shí)需要,在生成文件時(shí)嵌入的相應(yīng)的信息。注意:這不會附加列出的模塊到編譯圖,也就 是,你仍然需要在 Application.mk 中把它們添加到程序要求的模塊中。(11) LOCA
19、L_LDLIBS: 編譯你的模塊要使用的附加的鏈接器選項(xiàng)。這對于使用”-l ”前綴傳遞指定庫的名字是有用的。例如,下面將告訴鏈接器生成的模塊要在加載時(shí)刻鏈接到 /system/lib/libz.soLOCAL_LDLIBS := -lz看 docs/STABLE-APIS.TXT 獲取你使用 NDK 發(fā)行版能鏈接到的開放的系統(tǒng)庫列表。(13) LOCAL_ALLOW_UNDEFINED_SYMBOLS: 默認(rèn)情況下,在試圖編譯一個(gè)共享庫 時(shí),任何未定義的引用將導(dǎo)致一個(gè) “未定義的符號 ”錯(cuò)誤。這對于在你的源代碼文件中捕捉錯(cuò)誤 會有很大的幫助。然而,如果你因?yàn)槟承┰?,需要不啟動這項(xiàng)檢查,把這個(gè)
20、變量設(shè)為 true。注意相應(yīng)的共享庫可能在運(yùn)行時(shí)加載失敗。( 這個(gè)一般盡量不要去設(shè)為 true)(14) LOCAL_ARM_MODE: 默認(rèn)情況下, arm 目標(biāo)二進(jìn)制會以 thumb 的形式生成 (16位 ), 你可以通過設(shè)置這個(gè)變量為 arm 如果你希望你的 module 是以 32位指令的形式。arm (32-bit instructions) mode. E.g.:(15) LOCAL_ARM_MODE := arm 注意你同樣可以在編譯的時(shí)候告訴系統(tǒng)編譯特定的類 型,比如(16) LOCAL_SRC_FILES := foo.c bar.c.arm 這樣就告訴系統(tǒng)總是將 bar.c
21、 以 arm 的模式編 譯,下面是 GNU Make 功能宏,必須通過使用 $(call )來求值,他們返回文本化的信息。(17) my-dir: 返回當(dāng)前 Android.mk 所在的目錄路徑,相對于 NDK 編譯系統(tǒng)的頂層。這是 有用的,在 Android.mk 文件的開頭如此定義:LOCAL_PATH := $(call my-dir)(18) all-subdir-makefiles: 返回一個(gè)位于當(dāng)前 my-dir 路徑的子目錄列表。例如,看下面的目 錄層次:sources/foo/Android.mksources/foo/lib1/Android.mksources/foo/li
22、b2/Android.mk如果 sources/foo/Android.mk 包含一行:include $(call all-subdir-makefiles)那么它就會自動包含 sources/foo/lib1/Android.mk 和 sources/foo/lib2/Android.mk 。這項(xiàng)功 能用于向編譯系統(tǒng)提供深層次嵌套的代碼目錄層次。注意,在默認(rèn)情況下, NDK 將會只搜索 在 sources/*/Android.mk 中的文件。(19) this-makefile: 返回當(dāng)前 Makefile 的路徑 ( 即這個(gè)函數(shù)調(diào)用的地方 )(20) parent-makefile: 返
23、回調(diào)用樹中父 Makefile 路徑。即包含當(dāng)前 Makefile 的 Makefile 路 徑。(21) grand-parent-makefile 猜猜看 .3. Android.mk 使用模板在一個(gè) Android.mk 中可以生成多個(gè)可執(zhí)行程序、動態(tài)庫和靜態(tài)庫。(1) 編譯應(yīng)用程序的模板:#Test ExeLOCAL_PATH := $(call my-dir)#include $(CLEAR_VARS)LOCAL_SRC_FILES:= main.cLOCAL_MODULE:= test_exe#LOCAL_C_INCLUDES :=#LOCAL_STATIC_LIBRARIES :
24、=#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 表示以一個(gè)可執(zhí)行程序的方式進(jìn)行編譯。(2) 編譯靜態(tài)庫的模板:#Test Static LibLOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_SRC_FILES:=helloworld.cLOCAL_MODULE:= libtest_static#LOCAL_C_INCLUDES :=#LOCAL_STATIC_LIBRARIES :=#LOCAL_SHARED_LIBRARIES :=include $(BUILD_STATIC_LIBRARY)一般的和上面相似, BUILD_STATIC_LIBRARY 表示編譯一個(gè)靜態(tài)庫。(3) 編譯
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 高二上學(xué)期數(shù)學(xué)教學(xué)計(jì)劃大全2篇
- 婚宴女方父母婚禮致辭(3篇)
- 長城導(dǎo)游詞(35篇)
- 監(jiān)理資料員年度工作總結(jié)
- 領(lǐng)導(dǎo)力開發(fā)心得體會
- 滿月酒慶典上的講話稿(35篇)
- 讀《三國演義》閱讀心得體會(32篇)
- 相交線與平行線(題型歸納)(原卷版+解析)
- 26.4 解直角三角形的應(yīng)用 同步練習(xí)
- 2024保育員(高級)復(fù)審考試題庫(含答案)
- 2023年旅行社經(jīng)營管理教案
- 體育與健康 五禽戲(2022年秋2021級)學(xué)習(xí)通課后章節(jié)答案期末考試題庫2023年
- Unit 5 Dinners ready A Lets spell(說課稿)人教PEP版英語四年級上冊
- 藝術(shù)設(shè)計(jì)專業(yè)人才需求報(bào)告
- 中醫(yī)醫(yī)療技術(shù)手冊目錄(普及版)
- 解碼國家安全知到章節(jié)答案智慧樹2023年國際關(guān)系學(xué)院
- 三年級家長會PPT語文教師用
- 喬治華盛頓介紹George Washington
- 腳內(nèi)側(cè)傳球說課PPT
- 2023年湖南化工職業(yè)技術(shù)學(xué)院單招職業(yè)適應(yīng)性測試題庫及答案解析
- 檢查工作紀(jì)律及注意事項(xiàng)
評論
0/150
提交評論