LOCAL_PATH := $(call my-dir)</p><p>include $(CLEAR_VARS)</p><p>LOCAL_MODULE := tun</p><p>LOCAL_SRC_FILES := tunemu.c tun.c</p><p>LOCAL_CFLAGS := /<br />-I/home/xuxin/mylib/android-platform_external_libpcap/jni</p><p>LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llog -lpcap -L/home/xuxin/mylib/android-platform_external_libpcap/libs/armeabi</p><p>include $(BUILD_SHARED_LIBRARY)<br />
1 LOCAL_PATH必須位於Android.mk檔案的最開始。它是用來定位源檔案的位置,$(call my-dir)的作用就是返回目前的目錄的路徑。
include $(CLEAR_VARS)的作用是清除一些變數的值,但是LOCAL_PATH除外。
LOCAL_MODULE是用來指定當前待編譯模組的名稱,在樣本中的模組名稱為hello-jni
LOCAL_SRC_FILES是用來指定參與編譯的原始碼檔案。這裡只編譯hell0-jin.c
include $(BUILD_SHARED_LIBRARY)是用來指示將當前模組編譯為共用庫,首碼為lib,尾碼為.so。
還有另外一個BUILD_STATIC_LIBRARY,是用來指示將當前模組編譯為靜態庫的,首碼為.a,尾碼為.a。
這就是一個最簡單的Android.mk的結構。可能還有另外一點需要介紹:
2、定義多個Android.mk檔案。
有的時候,需要編譯的模組比較多,我們可能會將對應的模組放置在相應的目錄中,這樣,我們可以在每個目錄中定義對應的Android.mk檔案(類似於上面的寫法),最後,在根目錄放置一個Android.mk檔案,內容如下:
include $(call all-subdir-makefiles)
只需要這一行就可以了,它的作用就是包含所有子目錄中的Android.mk檔案
3、也可以在一個Android.mk檔案裡包含多個模組。
很直觀的想法就是將第一個Android.mk檔案的內容複寫一份,然後修改。我最開始也是這樣做的,但是後來出現問題了,在第二個模組中的源碼找不到,最後還是看文檔,發現裡面已經有樣本解釋了:
LOCAL_PATH := $(call my-dir)
IMPORTANT NOTE: Due to the way GNU Make works, this really returns
the path of the *last* *included* *Makefile* during the parsing of
build scripts. Do not call my-dir after including another file.
大意是:基於GNU make的工作方式,$(call my-dir)會返回在解析build指令碼時,遇到的最後一個 include中涉及的目錄。
所以,很多時候,在這個Android.mk裡面只需要調用一次$(call my-dir)就夠了,如果所有的源檔案都在一個目錄中。
如果需要的話,可以在第一次調用call my-dir的時候,將值儲存下來,比如:
MY_LOCAL_PATH := $(call my-dir)
LOCAL_PATH := $(MY_LOCAL_PATH)
然後,在另外一個模組中,繼續如下定義:
LOCAL_PATH := $(MY_LOCAL_PATH)
4,有時候我們需要引入第三方庫檔案,就需要配置
LOCAL_CFLAGS := /
-I/home/xuxin/mylib/android-platform_external_libpcap/jni
LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llog -lpcap -L/home/xuxin/mylib/android-platform_external_libpcap/libs/armeabi
這兩個變數,LOCAL_CFLAGS := 主要是引用外部的C標頭檔, -I 是標頭檔的存放路徑,如果該標頭檔和我們自己的源檔案放在同一級目錄,則不需要配置;
LOCAL_LDLIBS := 是引用外部庫檔案,-L是指定該lib檔案的存放路徑