閱讀742 返回首頁    go 阿裏雲 go 技術社區[雲棲]


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

  上一篇:go Core Data淺談係列之一 : 基礎結構
  下一篇:go 【spring】一般情況下,我們一般建議在一對多雙向關聯關係中,將一方的inverse屬性設置為true