Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> android.mk 詳解

android.mk 詳解

編輯:關於Android編程

Android.mk中一些屬性、方法、定義,總之就想詳細了解下Android.mk文件,
我先拋磚引玉。
LOCAL_PATH
必須位於Android.mk文件的最開始。它是用來定位源文件的位置,$(call my-dir)的作用就是返回當前目錄的路徑。
 

Android.mk 定義 屬性 方法
 


Android.mk文件是GNU Makefile的一小部分,它用來對Android程序進行編譯。

因為所有的編譯文件都在同一個 GNU MAKE 執行環境中進行執行,而Android.mk中所有的變量都是全局的。因此,您應盡量少聲明變量,不要認為某些變量在解析過程中不會被定義。

一個Android.mk文件可以編譯多個模塊,每個模塊屬下列類型之一:

1)APK程序

一般的Android程序,編譯打包生成apk文件

2)JAVA庫

java類庫,編譯打包生成jar文件

3)CC++

可執行的CC++

4)CC++

編譯生成CC++

5)CC++

編譯生成共享庫(動態鏈接庫),並打包成.so文, 有且只有共享庫才能被安裝/復制到您的應用軟件(APK)包中。

可以在每一個Android.mk file 中定義一個或多個模塊,你也可以在幾個模塊中使用同一個

源代碼文件。 編譯系統為你處理許多細節問題。例如,你不需要在你的 Android.mk 中列出頭文件和依

賴文件。編譯系統將會為你自動處理這些問題。這也意味著,在升級 NDK 後,你應該

得到新的toolchain/platform支持,而且不需要改變你的 Android.mk 文件。

注意,NDK的Anroid.mk語法同公開發布的Android平台開源代碼的Anroid.mk語法很接近,然而編譯系統實現他們的

方式卻是不同的,這是故意這樣設計的,可以讓程序開發人員重用外部庫的源代碼更容易。

在描述語法細節之前,咱們來看一個簡單的”hello world”的例子,比如,下面的文件:

sources/helloworld/helloworld.c

sources/helloworld/Android.mk

’helloworld.c’是一個 JNI 共享庫,實現返回”hello world”字符串的原生方法。相應的

Android.mk 文件會象下面這樣:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE:= helloworld

LOCAL_SRC_FILES := helloworld.c

include $(BUILD_SHARED_LIBRARY)

解釋一下幾行代碼:

LOCAL_PATH := $(call my-dir)

一個Android.mk file首先必須定義好LOCAL_PATH變量。它表示是當前文件的路徑。

在這個例子中, 宏函數‘my-dir’, 由編譯系統提供, 用於返回當前路徑(即包含Android.mk file

文件的目錄)。

include $(CLEAR_VARS)

CLEAR_VARS 由編譯系統提供(可以在 android 安裝目錄下的/build/core/config.mk 文件看到其定義,為 CLEAR_VARS:=$(BUILD_SYSTEM)/clear_vars.mk),指定讓GNU MAKEFILE該腳本為你清除許多 LOCAL_XXX 變量 ( 例如 LOCAL_MODULE , LOCAL_SRC_FILES ,LOCAL_STATIC_LIBRARIES,等等…),除 LOCAL_PATH。這是必要的,因為所有的編譯文件都在同一個 GNU MAKE 執行環境中,所有的變量都是全局的。所以我們需要先清空這些變量(LOCAL_PATH除外)。又因為LOCAL_PATH總是要求在每個模塊中都要進行設置,所以並需要清空它。

另外注意,該語句的意思就是把CLEAR_VARS變量所指向的腳本文件包含進來。

LOCAL_MODULE := helloworld

LOCAL_MODULE 變量必須定義,以標識你在 Android.mk 文件中描述的每個模塊。名稱必須是唯一的,而且不包含任何空格。注意編譯系統會自動產生合適的前綴和後綴,換句話說,一個被命名為’foo’的共享庫模塊,將會生成’libfoo.so’文件。

注意:如果把庫命名為‘libhelloworld’,編譯系統將不會添加任何的 lib 前綴,也會生成 libhelloworld.so。

LOCAL_SRC_FILES := helloworld.c

LOCAL_SRC_FILES 變量必須包含將要編譯打包進模塊中的 C 或 C++源代碼文件。不用

在這裡列出頭文件和包含文件,編譯系統將會自動找出依賴型的文件,當然對於包含文件,你包含時指定的路徑應該正確。

注意,默認的 C++源碼文件的擴展名是‘.cpp’ 。指定一個不同的擴展名也是可能的,只要定義LOCAL_DEFAULT_CPP_EXTENSION 變量,不要忘記開始的小圓點(也就是定義為 ‘.cxx’,而不是‘cxx’)

include $(BUILD_SHARED_LIBRARY)

BUILD_SHARED_LIBRARY 是編譯系統提供的變量,指向一個 GNU Makefile 腳本(應該

就是在 build/core 目錄下的 shared_library.mk) ,將根據LOCAL_XXX系列變量中的值,來編譯生成共享庫(動態鏈接庫)。

如果想生成靜態庫,則用BUILD_STATIC_LIBRARY

在NDK的sources/samples目錄下有更復雜一點的例子,寫有注釋的 Android.mk 文件。

二、自定義變量

以下是在 Android.mk中依賴或定義的變量列表, 可以定義其他變量為自己使用,但是NDK編譯系統保留下列變量名:

-以 LOCAL_開頭的名字(例如 LOCAL_MODULE)

-以 PRIVATE_, NDK_ 或 APP_開頭的名字(內部使用)

-小寫名字(內部使用,例如‘my-dir’)

如果為了方便在 Android.mk 中定義自己的變量,建議使用 MY_前綴,一個小例子:

MY_SOURCES := foo.c

ifneq ($(MY_CONFIG_BAR),)

MY_SOURCES += bar.c

endif

LOCAL_SRC_FILES += $(MY_SOURCES)

注意:‘:=’是賦值的意思;’+=’是追加的意思;‘$’表示引用某變量的值。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved