android ndk 之Android.mk編寫
最近在移植一個linux下的c庫到android,學習編寫Android.mk文件,特地花了點時間學習。
在網上搜了很多,最後發現還是看ndk的文檔最直接,也最全麵,下麵的總結主要是根據ndk提供的文檔編寫的。
1、單一的Android.mk文件:
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := hello-jni LOCAL_SRC_FILES := hello-jni.c include $(BUILD_SHARED_LIBRARY)
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的結構。可能還有另外一點需要介紹:
LOCAL_C_INCLUDES:=include 這個是用來指定在編譯時即將使用的c頭文件的位置,以當前目錄為起點。
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)
在編譯一般的c源代碼時,上麵的基本可以滿足了,等後麵需要,再繼續補充吧!
補充:
關於LOCAL_CFLAGS
在某些時候,編譯源碼需要定義宏變量,這個時候,我們可以直接在對應的源碼裏麵去修改,但也有一些情況,我們是沒法在別人的源碼裏定義宏變量的,這個時候,就需要使用到LOCAL_CFLAGS 了 ,舉例如下:
LOCAL_CFLAGS += -D__FAVOR_BSD
這行代碼的作用就是在原有的cflags基礎上,再定義一個宏變量__FAVOR_BSD
類似於#define __FAVOR_BSD
轉載:https://aswang.iteye.com/blog/1036130
最後更新:2017-04-04 07:03:41