




下載本文檔
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、Introduction:Android.mk編譯文件是用來(lái)向AndroidNDK描述你的C,C+源代碼文件的,這篇文檔描述了它的語(yǔ)法。在閱讀下面的內(nèi)容之前,假定你已經(jīng)閱讀了docs/OVERVIEW.TXT文件,了解了它們的腳色和用途。一、概述一個(gè)Android.mkfile用來(lái)向編譯系統(tǒng)描述你的源代碼。具體來(lái)說(shuō):(1)該文彳是GNUMakefile的一小部分,會(huì)被編譯系統(tǒng)解析一次或更多次的build系統(tǒng)。因此,您應(yīng)盡量減少您聲明的變量,不要認(rèn)為某些變量在解析過(guò)程中不會(huì)被定義。(2)這個(gè)文件的語(yǔ)法允許把你的源代碼組織成模塊,一個(gè)模塊屬下列類型之一:1)靜態(tài)庫(kù)2)共享庫(kù),且只有共享庫(kù)將被安裝/
2、復(fù)制到您的應(yīng)用軟件包,雖然靜態(tài)庫(kù)能被用于生成共享庫(kù)。你可以在每一個(gè)Android.mkfile中定義一個(gè)或多個(gè)模塊,你也可以在幾個(gè)模塊中使用同一個(gè)源代碼文件。(1)編譯系統(tǒng)為你處理許多細(xì)節(jié)問(wèn)題。例如,你不需要在你的Android.mk中列出頭文件和依賴文件。NDK編譯系統(tǒng)將會(huì)為你自動(dòng)處理這些問(wèn)題。這也意味著,在升級(jí)NDK后,你應(yīng)該得到新的toolchain/platform支持,而且不需要改變你的Android.mk文件。注意,這個(gè)語(yǔ)法同公開(kāi)發(fā)布的Android平臺(tái)的開(kāi)源代碼很接近,然而編譯系統(tǒng)實(shí)現(xiàn)他們的方式卻是不同的,這是故意這樣設(shè)計(jì)的,可以讓程序開(kāi)發(fā)人員重用外部庫(kù)的源代碼更容易。在描述語(yǔ)法
3、細(xì)節(jié)之前,咱們來(lái)看一個(gè)簡(jiǎn)單的"helloworld"的例子,比如,下面的文件:sources/helloworld/helloworld.csources/helloworld/Android.mk'helloworld.c'是一個(gè)JNI共享庫(kù),實(shí)現(xiàn)返回"helloworld"字符串的原生方法。相應(yīng)的Android.mk文件會(huì)象下面這樣:LOCAL_PATH:=$(callmy-dir)include$(CLEAR_VARS)LOCAL_MODULE:=helloworldLOCAL_SRC_FILES:=helloworld.cincl
4、ude$(BUILD_SHARED_LIBRARY)好,我們來(lái)解釋一下這幾行代碼:LOCAL_PATH:=$(callmy-dir)一個(gè)Android.mkfile首先必須定義好LOCAL_PATH變量。它用于在開(kāi)發(fā)樹(shù)中查找源文件。在這個(gè)例子中,宏函數(shù)?my-dir?,由編譯系統(tǒng)提供,用于返回當(dāng)前路徑(即包含Android.mkfile文件的目錄)。include$(CLEAR_VARS)CLEAR_VARS由編譯系統(tǒng)提供,指定讓GNUMAKEFILE為你清除許多LOCAL_XXX變量(例如LOCAL_MODULE,LOCAL_SRC_FILES,LOCAL_STATIC_LIBRARIES,
5、等等.),除LOCAL_PATH。這是必要的,因句所有而編譯控制文件而在同一個(gè)GNUMAKE執(zhí)行環(huán)境中,所有白森量都是全局的。LOCAL_MODULE:=helloworldLOCAL_MODULE變量必須定義,以標(biāo)識(shí)你在Android.mk文件中描述的每個(gè)模塊。名稱必須是唯一的,而且不包含任何空格。注意編譯系統(tǒng)會(huì)自動(dòng)產(chǎn)生合適的前綴和后綴,換句話說(shuō),一個(gè)被命名為foo的共享庫(kù)模塊,將會(huì)生成libfoo.so'文件。重要注意事項(xiàng):如果你把庫(kù)命名為,libhelloworld?,編譯系統(tǒng)將不會(huì)添加任何的lib前綴,也會(huì)生成libhelloworld.so,這是為了支持來(lái)源于Android平
6、臺(tái)的源代碼的Android.mk文件,如果你確實(shí)需要這么做的話。LOCAL_SRC_FILES:=helloworld.cLOCAL_SRC_FILES變量必須包含將要編譯打包進(jìn)模塊中的C或C+源代碼文件。注意,你不用在這里列出頭文件和包含文件,因?yàn)榫幾g系統(tǒng)將會(huì)自動(dòng)為你找出依賴型的文件;僅僅列出直接傳遞給編譯器的源代碼文件就好?!咀⒁?,默認(rèn)的C+源碼文件的擴(kuò)展名是?.cpp?.指定一個(gè)不同的擴(kuò)展名也是可能的,只要定義LOCAL_DEFAULT_CPP_EXTENSION變量,不要忘記開(kāi)始的小圓點(diǎn)(也就是定義為,.cxx?,而不是,cxx?)(當(dāng)然這一步我們一般不會(huì)去改它)include$(BU
7、ILD_SHARED_LIBRARY)BUILD_SHARED_LIBRARY是編譯系統(tǒng)提供的變量,指向一個(gè)GNUMakefile腳本(應(yīng)該就是在build/core目錄下的shared_library.mk),負(fù)責(zé)收集自從上次調(diào)用'include$(CLEAR_VARS)'以來(lái),定義在LOCAL_XXX變量中的所有信息,并且決定編譯什么,如何正確地去做。并根據(jù)其規(guī)則生成靜態(tài)庫(kù)。同理對(duì)于靜態(tài)庫(kù)。在sources/samples目錄下有更復(fù)雜一點(diǎn)的例子,寫(xiě)有注釋的Android.mk文件,你可以看看。一分",一、爹苦這是一份你應(yīng)該在Android.mk中依賴或定義的變量
8、列表,您可以定義其他變量為自己使用,但是NDK編譯系統(tǒng)保留下列變量名:- 以LOCAL_開(kāi)頭的名字(例如LOCAL_MODULE)- 以PRIVATE_,NDK_orAPP_開(kāi)頭的名字(內(nèi)部使用)- 小寫(xiě)名字(內(nèi)部使用,例如?my-dir?)如果您為了方便在Android.mk中定義自己的變量,我們建議使用MY_前綴,一個(gè)小例子:MY_SOURCES:=foo.cifneq($(MY_CONFIG_BAR),)endifLOCAL_SRC_FILES+=$(MY_SOURCES)1. GNUMake變量這些GNUMake變量在你的Android.mk文件解析之前,就由編譯系統(tǒng)定義好了。注意在某
9、些情況下,NDK可能分析Android.mk幾次,每一次某些變量的定義會(huì)有不同。(1) CLEAR_VARS:指向一個(gè)編譯腳本,幾乎所有未定義的LOCAL_XXX變量都在"Module-description"節(jié)中列出。你必須在開(kāi)始一個(gè)新模塊之前包含這個(gè)腳本。include$(CLEAR_VARS)(2) BUILD_SHARED_LIBRARY:指向編譯腳本,收集所有的你在LOCAL_XXX變量中提供的信息,并且決定如何把你列出的源代碼文件編譯成一個(gè)共享庫(kù)。注意,你必須至少在包含這個(gè)文件之前定義LOCAL_MODULE和LOCAL_SRC_FILES,使用例子:inclu
10、de$(BUILD_SHARED_LIBRARY)(注意這將生成一個(gè)名為lib$(LOCAL_MODULE).so的文件)(3) BUILD_STATIC_LIBRARY:一個(gè)BUILD_SHARED_LIBRARY變量用于編譯一個(gè)靜態(tài)庫(kù)。靜態(tài)庫(kù)不會(huì)復(fù)制到你的project/packages中,但是能夠用于編譯共享庫(kù),(看下面描述的LOCAL_STATIC_LIBRARIESandLOCAL_STATIC_WHOLE_LIBRARIES)使用例子:include$(BUILD_STATIC_LIBRARY)(注意,這將會(huì)生成一個(gè)名為lib$(LOCAL_MODULE).a的文件)。(4) TA
11、RGET_ARCH:目標(biāo)CPU平臺(tái)的名字,和android開(kāi)放源碼中指定的那樣。如果是arm,表示要生成ARM兼容的指令,與CPU架構(gòu)的修訂版無(wú)關(guān)。(5) TARGET_PLATFORM:Android.mk解析的時(shí)候,目標(biāo)Android平臺(tái)的名字.詳情可參考/development/ndk/docs/stable-apis.txt.android-3->OfficialAndroid1.5systemimagesandroid-4->OfficialAndroid1.6systemimagesandroid-5->OfficialAndroid2.0systemimages
12、(6) TARGET_ARCH_ABI:暫時(shí)只支持兩個(gè)value,armeabi和armeabi-v7a。在現(xiàn)在的版本中一般把這兩個(gè)值簡(jiǎn)單的定義為arm,通過(guò)android平臺(tái)內(nèi)部對(duì)它重定義來(lái)獲得更好的匹配。其他的ABI將在以后的NDK版本中介紹,它們會(huì)有不同的名字。注意所有基于ARM的ABI者B會(huì)把'TARGET_ARCH'定義成,arm?,但是會(huì)有不同的,TARGET_ARCH_ABI?(7) TARGET_ABI:目標(biāo)平臺(tái)和ABI的組合,它事實(shí)上被定義成$(TARGET_PLATFORM)-$(TARGET_ARCH_ABI)在你想要在真實(shí)的設(shè)備中針對(duì)一個(gè)特別的目標(biāo)系統(tǒng)進(jìn)
13、行測(cè)試時(shí),會(huì)有用。在默認(rèn)的情況下,它會(huì)是android-3-arm'。2.模塊描述變量下面的變量用于向編譯系統(tǒng)描述你的模塊。你應(yīng)該定義在'include$(CLEAR_VARS)'和'include$(BUILD_XXXXX)'之間。正如前面描寫(xiě)的那樣,$(CLEAR_VARS是一個(gè)腳本,清除所有這些變量,除非在描述中顯式注明。(1) LOCAL_PATH:這個(gè)變量用于給出當(dāng)前文件的路徑。你必須在Android.mk的開(kāi)頭定義,可以這樣使用:LOCAL_PATH:=$(callmy-dir)這個(gè)變量不會(huì)被$(CLEAR_VARS)清除,因此每個(gè)Andro
14、id.mk只需要定義一次(即使你在一個(gè)文件中定義了幾個(gè)模塊的情況下)。(2) LOCAL_MODULE:這是你模塊的名字,它必須是唯一的,而且不能包含空格。你必須在包含任一的$(BUILD_XXXX)腳本之前定義它。模塊的名字決定了生成文件的名字,例如,如果一個(gè)一個(gè)共享庫(kù)模塊的名字是,那么生成文件的名字就是lib.so。但是,在你的NDK生成文件中(或者Android.mk或者Application.mk),你應(yīng)該只涉及(引用)有正常名字的其他模塊。(3) LOCAL_SRC_FILES:這是要編譯的源代碼文件列表。只要列出要傳遞給編譯器的文件,因?yàn)榫幾g系統(tǒng)自動(dòng)為你計(jì)算依賴。注意源代碼文件名稱
15、都是相對(duì)于LOCAL_PATH的,你可以使用路徑部分,例如:LOCAL_SRC_FILES:=foo.ctoto/bar.c注意:在生成文件中都要使用UNIX風(fēng)格的斜杠(/).windows風(fēng)格的反斜杠不會(huì)被正確的處理。(4) LOCAL_CPP_EXTENSION:這是一個(gè)可選變量,用來(lái)指定C+代碼文件的擴(kuò)展名,默認(rèn)是'.cpp',但是你可以改變它,比如:LOCAL_CPP_EXTENSION:=.cxx(5) LOCAL_C_INCLUDES:路徑的可選配置,是從根目錄開(kāi)始的,allsources(C,C+andAssembly).Forexample:LOCAL_C_IN
16、CLUDES:=sources/fooOreven:LOCAL_C_INCLUDES:=$(LOCAL_PATH)/./foo需要在任何包含LOCAL_CFLAGS/LOCAL_CPPFLAGS標(biāo)志之前。(6) LOCAL_CFLAGS:可選的編譯器選項(xiàng),在編譯C代碼文件的時(shí)候使用。這可能是有用的,指定一個(gè)附加的包含路徑(相對(duì)于NDK的頂層目錄),宏定義,或者編譯選項(xiàng)。重要信息:不要在Android.mk中改變optimization/debugging級(jí)別,只要在Application.mk中指定合適的信息,就會(huì)自動(dòng)地為你處理這個(gè)問(wèn)題,在調(diào)試期間,會(huì)讓NDK自動(dòng)生成有用的數(shù)據(jù)文件。(7)LO
17、CAL_CXXFLAGS:SameasLOCAL_CFLAGSforC+sourcefiles(8) LOCAL_CPPFLAGS:與LOCAL_CFLAGS相同,但是對(duì)C和C+sourcefiles者B適用。(9) LOCAL_STATIC_LIBRARIES:應(yīng)該鏈接到這個(gè)模塊的靜態(tài)庫(kù)列表(使用BUILD_STATIC_LIBRARY生成),這僅僅對(duì)共享庫(kù)模塊才有意義。(10) LOCAL_SHARED_LIBRARIES:這個(gè)模塊在運(yùn)行時(shí)要依賴的共享庫(kù)模塊列表,在鏈接時(shí)需要,在生成文件時(shí)嵌入的相應(yīng)的信息。注意:這不會(huì)附加列出的模塊到編譯圖,也就是,你仍然需要在Application.mk
18、中把它們添加到程序要求的模塊中。(11) LOCAL_LDLIBS:編譯你的模塊要使用的附加的鏈接器選項(xiàng)。這對(duì)于使用“-l'前綴傳遞指定庫(kù)的名字是有用的。例如,下面將告訴鏈接器生成的模塊要在加載時(shí)刻鏈接到/system/lib/libz.soLOCAL_LDLIBS:=-lz看docs/STABLE-APIS.TXT獲取你使用NDK發(fā)行版能鏈接到的開(kāi)放的系統(tǒng)庫(kù)列表。(13) LOCAL_ALLOW_UNDEFINED_SYMBOLS:默認(rèn)情況下,在試圖編譯一個(gè)共享庫(kù)時(shí),任何未定義的引用將導(dǎo)致一個(gè)朱定義的符號(hào)”錯(cuò)誤。這對(duì)于在你的源代碼文件中捕捉錯(cuò)誤會(huì)有很大的幫助。然而,如果你因?yàn)槟承┰?/p>
19、,需要不啟動(dòng)這項(xiàng)檢查,把這個(gè)變量設(shè)為,true?。注意相應(yīng)的共享庫(kù)可能在運(yùn)行時(shí)加載失敗。(這個(gè)一般盡量不要去設(shè)為true)(14) LOCAL_ARM_MODE:默認(rèn)情況下,arm目標(biāo)二進(jìn)制會(huì)以thumb的形式生成(16位),你可以通過(guò)設(shè)置這個(gè)變量為arm如果你希望你的module是以32位指令的形式。'arm'(32-bitinstructions)mode.E.g.:(15) LOCAL_ARM_MODE:=arm注意你同樣可以在編譯的時(shí)候告訴系統(tǒng)編譯特定的類型,比如(16) LOCAL_SRC_FILES:=foo.cbar.c.arm這樣就告訴系統(tǒng)總是將bar.c以ar
20、m的模式編譯,下面是GNUMake,功能?宏,必須通過(guò)使用$(call)'來(lái)求值,他們返回文本化的信息。(17) my-dir:返回當(dāng)前Android.mk所在的目錄路徑,相對(duì)于NDK編譯系統(tǒng)的頂層。這是有用的,在Android.mk文件的開(kāi)頭如此定義:LOCAL_PATH:=$(callmy-dir)(18) all-subdir-makefiles:返回一個(gè)位于當(dāng)前'my-dir'路徑的子目錄列表。例如,看下面的目錄層次:sources/foo/Android.mksources/foo/lib1/Android.mksources/foo/lib2/Android
21、.mk如果sources/foo/Android.mk包含一行:include$(callall-subdir-makefiles)那么它就會(huì)自動(dòng)包含sources/foo/lib1/Android.mk和sources/foo/lib2/Android.mk。這項(xiàng)功能用于向編譯系統(tǒng)提供深層次嵌套的代碼目錄層次。注意,在默認(rèn)情況下,NDK將會(huì)只搜索在sources/*/Android.mk中的文件。(19) this-makefile:返回當(dāng)前Make巾le的路徑(即這個(gè)函數(shù)調(diào)用的地方)(20) parent-makefile:返回調(diào)用樹(shù)中父Makefile路徑。即包含當(dāng)前Makefile的M
22、akefile路徑。(21) grand-parent-makefile猜猜看.3.Android.mk使用模板在一個(gè)Android.mk中可以生成多個(gè)可執(zhí)行程序、動(dòng)態(tài)庫(kù)和靜態(tài)庫(kù)。(1)編譯應(yīng)用程序的模板:#TestExeLOCAL_PATH:=$(callmy-dir)#include$(CLEAR_VARS)LOCAL_SRC_FILESkmain.cLOCAL_MODULE:=test_exe#LOCAL_C_INCLUDES:=#LOCAL_STATIC_L舊RARIES:=#LOCAL_SHARED_LIBRARIES:=include$(BUILD_EXECUTABLE)(菜鳥(niǎo)級(jí)別
23、解釋:k是賦值的意思,$是引用某變量的值)LOCAL_SRC_FILES中加入源文件路徑,LOCAL_C_INCLUDES中加入所需要包含的頭文件路徑,LOCAL_STATIC_LIBRARIES加入所需要鏈接的靜態(tài)庫(kù)(*.a)的名稱,LOCAL_SHARED_LIBRARIES中力口入所需要鏈接的動(dòng)態(tài)庫(kù)(*.so)的名稱,LOCAL_MODULE表示模塊最終的名稱,BUILD_EXECUTABLE表示以一個(gè)可執(zhí)行程序的方式進(jìn)行編譯。(2)編譯靜態(tài)庫(kù)的模板:#TestStaticLibLOCAL_PATH:=$(callmy-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è)
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 仿真綠化租賃合同樣本
- 加盟資質(zhì)借用合同標(biāo)準(zhǔn)文本
- 供貨委托合同范例
- 人教版四年級(jí)上冊(cè)數(shù)學(xué)期中試題及答案
- 音樂(lè)風(fēng)格的樂(lè)理知識(shí)結(jié)合能力測(cè)評(píng)試題及答案
- 民法總則測(cè)試題及答案
- 疫情綜合類試題及答案
- 音樂(lè)理論與實(shí)踐的結(jié)合對(duì)教育的影響分析試題及答案
- 血液凈化三基試題及答案
- 電商零售環(huán)境的變化與挑戰(zhàn)試題及答案
- 2024年四川省公安廳招聘警務(wù)輔助人員真題
- 2025年電子信息工程師職業(yè)資格考試試卷及答案
- 機(jī)械制造及非標(biāo)零部件加工項(xiàng)目突發(fā)環(huán)境事件應(yīng)急預(yù)案
- 2025年紹興市九年級(jí)中考語(yǔ)文一模試卷附答案解析
- 江蘇省建筑與裝飾工程計(jì)價(jià)定額(2014)電子表格版
- 小學(xué)奧數(shù):乘法原理之染色法.專項(xiàng)練習(xí)及答案解析
- 西藏林芝地區(qū)地質(zhì)災(zāi)害防治規(guī)劃
- 入團(tuán)志愿書(shū)樣本(空白)
- 老年人燙傷的預(yù)防與護(hù)理課件
- 部編版小學(xué)道德與法治六年級(jí)下冊(cè)《各不相同的生活環(huán)境》課件
- 國(guó)內(nèi)外經(jīng)濟(jì)形勢(shì)和宏觀經(jīng)濟(jì)政策展望課件
評(píng)論
0/150
提交評(píng)論