Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android.mk語法規范

Android.mk語法規范

編輯:關於Android編程

總結一下Android.mk的寫法,供以後使用。   例子 可以先看一個例子:  
LOCAL_PATH:=$(call my-dir)  
include $(CLEAR_VARS)  
LOCAL_SRC_FILES:= \  
        NmpMediaBase.cpp   
  
LOCAL_CPPFLAGS+= -Wall -W -Wno-format \  
        -Os -O2 -fmessage-length=0 -MMD -MP -DSILENT  
LOCAL_C_INCLUDES+= \  
        $(LOCAL_PATH)/3rdpart/3901/include \  
        /opt/ali_sdk/staging/usr/include/ali/nmp/  
  
LOCAL_SHARED_LIBRARIES := -lstdc++ libstlport -lpthread   
  
LOCAL_LDLIBS:= -L./ -ljson -lc -ldl -lstdc++ -lm  
  
#LOCAL_CXX := arm-linux-gnueabi-g++    
  
#LOCAL_CPP_FEATURES += exceptions  
LOCAL_CPPFLAGS += -fexceptions -fpermissive  
  
LOCAL_MODULE:=mediabase  
LOCAL_MODULE_TAGS := optional  
include $(BUILD_EXECUTABLE)  

 

  變量解析: LOCAL_PATH:=$(call my-dir) LOCAL_PATH表示此時位於工程目錄的根目錄中,(call my-dir)的功能由編譯器提供,被用來返回當前目錄的地址(這裡的當前目錄裡包含   Android.mk這個文件本身)。   include $(CLEAR_VARS) CLEAR_VARS這個變量由編譯器提供,並且指明了一個GNU Makefile文件,這個功能會清理掉所有以LOCAL_開頭的內容(例如 LOCAL_MODULE、   LOCAL_FILES、LOCAL_STATIC_LIBRARIES等),除了LOCAL_PATH。這句話是必須的,因為如果所有的變量都是全局的,所有的可控的編譯文件   都需要在一個單獨的GNU中被解析並執行。   LOCAL_SRC_FILES變量必須包含一個C、C++或者java源文件的列表,這些會被編譯並聚合到一個模塊中。只要列出要傳遞給編譯器的文件,因   為編譯系統自動計算依賴。注意源代碼文件名稱都是相對於 LOCAL_PATH的,你可以使用路徑部分,例如: LOCAL_SRC_FILES := foo.c toto/bar.c\         Hello.c 文件之間可以用空格或Tab鍵進行分割,換行請用"\",如果是追加源代碼文件的話,請用LOCAL_SRC_FILES +=。 注意:可以LOCAL_SRC_FILES := $(call all-subdir-java-files)這種形式來包含local_path目錄下的所有java文件。   LOCAL_MODULE 變量必須被定義,用來區分android.mk中的每一個模塊。文件名必須是唯一的,不能有空格。注意,這裡編譯器會為你自動加   上一些前綴和後綴,來保證文件是一致的。 BUILD_EXECUTABLE這個變量是由系統提供的,並且制定給GNU Makefile的腳本,它可以收集所有你定義的“include $(CLEAR_VARS)”中以   LOCAL_開頭的變量,並且決定哪些要被編譯,哪些應該做的更加准確。表示將編譯生成一個可執行文件。 我們同樣也可以使用: BUILD_SHARED_LIBRARY來生成一個動態庫; BUILD_STATIC_LIBRARY來生成一個靜態的庫; BUILD_PACKAGE來生成一個APK; LOCAL_OVERRIDES_PACKAGES此變量可以使其他的模塊不加入編譯,如源碼中DeskClock的android.mk有LOCAL_OVERRIDES_PACKAGES :=    AlarmClock,使 AlarmClock不會加入到編譯系統中,不會生成 AlarmClock.apk。   LOCAL_STATIC_LIBRARIES: 表示該模塊需要使用哪些靜態庫,以便在編譯時進行鏈接。 LOCAL_SHARED_LIBRARIES:  表示模塊在運行時要依賴的共享庫(動態庫),在鏈接時就需要,以便在生成文件時嵌入其相應的信息。 注意:它不會附加列出的模塊到編譯圖,也就是仍然需要在Application.mk 中把它們添加到程序要求的模塊中。 LOCAL_LDLIBS:  編譯模塊時要使用的附加的鏈接器選項。這對於使用‘-l’前綴傳遞指定庫的名字是有用的。 例如,LOCAL_LDLIBS := -lz表示告訴鏈接器生成的模塊要在加載時刻鏈接到/system/lib/libz.so 可查看 docs/STABLE-APIS.TXT 獲取使用 NDK發行版能鏈接到的開放的系統庫列表。 LOCAL_LDLIBS :鏈接的庫不產生依賴關系,一般用於不需要重新編譯的庫,如庫不存在,則會報錯找不到。且貌似只能鏈接那些存在於系統   目錄下本模塊需要連接的庫。如果某一個庫既有動態庫又有靜態庫,那麼在默認情況下是鏈接的動態庫而非靜態庫。 如:LOCAL_LDLIBS += -lm –lz –lc -lcutils –lutils –llog  如果需要指定鏈接庫的路徑則直接在後面寫 -L再加路徑即可 LOCAL_SHARED_LIBRARIES 會生成依賴關系,當庫不存在時會去編譯這個庫。 LOCAL_LDFLAGS:這個編譯變量傳遞給鏈接器一個一些額外的參數,比如想傳遞而外的庫和庫路徑給ld,或者傳遞給ld linker的一些鏈接參數   ,-On,-EL{B}(大小端字節序),那麼就要加到這個上面,如: LOCAL_LDFLAGS += -L$(LOCAL_PATH)/lib/ -lHWrecog –EB{EL} –O{n} … 或者直接加上絕對路徑庫的全名: LOCAL_LDFLAGS += $(LOCAL_PATH)/lib/libHWrecog.a –EB{EL} –O{n} include $(call all-subdir-makefiles) 它的作用就是包含所有子目錄中的Android.mk文件 如果需要編譯的模塊比較多,我們可能會將對應的模塊放置在相應的目錄中, 這樣,我們可以在每個目錄中定義對應的Android.mk文件(類似於上面的寫法), 最後,在根目錄放置一個Android.mk文件,加入include $(call all-subdir-makefiles)   TARGET_ARCH指架構中CPU的名字已經被android開源代碼明確指出了。這裡的ARM包含了任何ARM-獨立結構的架構,以及每個獨立的CPU的版本   。 TARGET_PLATFORM: Android.mk 解析的時候,目標 Android 平台的名字. android-3 -> Official Android 1.5 system images android-4 -> Official Android 1.6 system images android-5 -> Official Android 2.0 system images TARGET_ARCH_ABI:  暫時只支持兩個 value,armeabi 和 armeabi-v7a TARGET_ABI: 目標平台和 ABI 的組合     LOCAL_C_INCLUDES:  可選變量,表示頭文件的搜索路徑。默認的頭文件的搜索路徑是LOCAL_PATH目錄。   LOCAL_MODULE_PATH 和 LOCAL_UNSTRIPPED_PATH 在 Android.mk 文件中, 還可以用LOCAL_MODULE_PATH 和LOCAL_UNSTRIPPED_PATH指定最後的目標安裝路徑. 不同的文件系統路徑用以下的宏進行選擇: TARGET_ROOT_OUT:表示根文件系統。 TARGET_OUT:表示 system文件系統。 TARGET_OUT_DATA:表示 data文件系統。 用法如:LOCAL_MODULE_PATH :=$(TARGET_ROOT_OUT) LOCAL_JNI_SHARED_LIBRARIES:定義了要包含的so庫文件的名字,如果程序沒有采用jni,不需要 LOCAL_JNI_SHARED_LIBRARIES := libxxx 這樣在編譯的時候,NDK自動會把這個libxxx打包進apk; 放在yourapk/lib/目錄下   LOCAL_CFLAGS可選的編譯器選項,在編譯C代碼文件的時候使用。這可能是有用的,指定一個附加的包含路徑(相對於NDK的頂層目錄),宏定義   ,或者編譯選項。注意:不要在Android.mk中改變optimization/debugging級別,只要在Application.mk中指定合適的信息,就會自動地為你   處理這個問題,在調試期間,會讓NDK自動生成有用的數據文件。 LOCAL_CXXFLAGS與LOCAL_CFLAGS相同,針對C++源文件。 LOCAL_CPPFLAGS與LOCAL_CFLAGS相同,但是對C和C++sourcefiles都適用。   NDK提供的函數宏: my-dir:返回當前 Android.mk 所在的目錄的路徑,相對於 NDK 編譯系統的頂層。這是有用的,在 Android.mk 文件的開頭如此定義: LOCAL_PATH := $(call my-dir) all-subdir-makefiles: 返回一個位於當前'my-dir'路徑的子目錄中的所有Android.mk的列表。 this-makefile:  返回當前Makefile 的路徑(即這個函數調用的地方) parent-makefile:  返回調用樹中父 Makefile 路徑。即包含當前Makefile的Makefile 路徑。 grand-parent-makefile:返回調用樹中父Makefile的父Makefile的路徑   在Android.mk中,“:=”是賦值的意思;“+=”是追加的意思;“$”表示引用某變量的值。 Android.mk給變量賦值,同時用的“:=”和“=”,他們分別代表什麼意思呢? “:=” 的意思是,它右邊賦得值如果是變量,只能使用在這條語句之前定義好的,而不能使用本條語句之後定義的變量; “=”,當它的右邊賦值是變量時,這個變量的定義在本條語句之前或之後都可以;   常見錯誤及解決辦法: fatal error: string: No such file or directory  解決辦法:增加Application.mk 寫 APP_STL :=gnustl_static   error: 'pthread_rwlock_t' does not name a type 在Application.mk中添加改寫application.mk文件,把版本改成9或更高,APP_PLATFORM := android-9     //對應2.3.1; 在Android API < 9時,采用android NDK編譯代碼是不支持pthread_rwlock_t結構體的。   Ndk編譯curl: 下載源碼:http://curl.haxx.se/download.html ./configure --host=arm-linux CC=arm-linux-gnueabi-gcc --prefix=//home/usrhome/johnny.he/androidworkspace/curl_install make;  make install
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved