android NDK的android.mk檔案的詳解

軍說網事發表於2015-11-30

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)

 

 IMPORTANTNOTE: Due to the way GNU Make works, this really returns
    the path of the *last* *included* *Makefile* during theparsing of
    build scripts. Do not call my-dir after including anotherfile.

 

大意是:基於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檔案的存放路徑。





相關文章