編輯:關於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)
注意:‘:=’是賦值的意思;’+=’是追加的意思;‘$’表示引用某變量的值。
最近做 android 項目遇到這個問題,為了保持 app 風格一致,需要將原生的EditText底線顏色改成橙色。網上搜了一些解決方案,特此記錄總結一下。效果圖默認的E
本文實例講述了Android編程實現調用系統圖庫與裁剪圖片功能。分享給大家供大家參考,具體如下:在Android開發中,調用系統圖庫和裁剪照片是很常見的需求。相對於自己實
本文實例為大家分享了Android仿安卓微信6.0的具體代碼,供大家參考,具體內容如下wechat6Activity.java的代碼:package siso.geekw
在Android項目開發過程中,Android Studio是一款非常強大的開發工具。到底有多強大,用了你就知道了。本文我將介紹Studio引用Library開源項目與導