亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

淺析Android.mk

 更新時(shí)間:2016年01月12日 10:32:07   作者:ly131420  
Android.mk是Android提供的一種makefile文件,用來(lái)指定諸如編譯生成so庫(kù)名、引用的頭文件目錄、需要編譯的.c/.cpp文件和.a靜態(tài)庫(kù)文件等。要掌握jni,就必須熟練掌握Android.mk的語(yǔ)法規(guī)范

 Android.mk簡(jiǎn)介:

Android.mk文件用來(lái)告知NDK Build 系統(tǒng)關(guān)于Source的信息。 Android.mk將是GNU Makefile的一部分,且將被Build System解析一次或多次。

所以,請(qǐng)盡量少的在Android.mk中聲明變量,也不要假定任何東西不會(huì)在解析過(guò)程中定義。

Android.mk文件語(yǔ)法允許我們將Source打包成一個(gè)"modules". modules可以是:

靜態(tài)庫(kù)

動(dòng)態(tài)庫(kù)。

只有動(dòng)態(tài)庫(kù)可以被 install/copy到應(yīng)用程序包(APK). 靜態(tài)庫(kù)則可以被鏈接入動(dòng)態(tài)庫(kù)。

可以在一個(gè)Android.mk中定義一個(gè)或多個(gè)modules. 也可以將同一份source 加進(jìn)多個(gè)modules.

Build System幫我們處理了很多細(xì)節(jié)而不需要我們?cè)訇P(guān)心。例如:你不需要在Android.mk中列出頭文件和外部依賴文件。

NDK Build System自動(dòng)幫我們提供這些信息。這也意味著,當(dāng)用戶升級(jí)NDK后,你將可以受益于新的toolchain/platform而不必再去修改Android.mk.

Android.mk語(yǔ)法:

首先看一個(gè)最簡(jiǎn)單的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 := $(call my-dir) 

每個(gè)Android.mk文件必須以定義LOCAL_PATH為開(kāi)始。它用于在開(kāi)發(fā)tree中查找源文件。

宏my-dir則由Build System提供。返回包含Android.mk的目錄路徑。

include $(CLEAR_VARS)

CLEAR_VARS 變量由Build System提供。并指向一個(gè)指定的GNU Makefile,由它負(fù)責(zé)清理很多LOCAL_xxx.

例如:LOCAL_MODULE, LOCAL_SRC_FILES, LOCAL_STATIC_LIBRARIES等等。但不清理LOCAL_PATH.

這個(gè)清理動(dòng)作是必須的,因?yàn)樗械木幾g控制文件由同一個(gè)GNU Make解析和執(zhí)行,其變量是全局的。所以清理后才能避免相互影響。

LOCAL_MODULE := hello-jni

LOCAL_MODULE模塊必須定義,以表示Android.mk中的每一個(gè)模塊。名字必須唯一且不包含空格。

Build System會(huì)自動(dòng)添加適當(dāng)?shù)那熬Y和后綴。例如,foo,要產(chǎn)生動(dòng)態(tài)庫(kù),則生成libfoo.so. 但請(qǐng)注意:如果模塊名被定為:libfoo.則生成libfoo.so. 不再加前綴。

LOCAL_SRC_FILES := hello-jni.c

LOCAL_SRC_FILES變量必須包含將要打包如模塊的C/C++ 源碼。

不必列出頭文件,build System 會(huì)自動(dòng)幫我們找出依賴文件。

缺省的C++源碼的擴(kuò)展名為.cpp. 也可以修改,通過(guò)LOCAL_CPP_EXTENSION。

include $(BUILD_SHARED_LIBRARY)

BUILD_SHARED_LIBRARY:是Build System提供的一個(gè)變量,指向一個(gè)GNU Makefile Script。

它負(fù)責(zé)收集自從上次調(diào)用 include $(CLEAR_VARS) 后的所有LOCAL_XXX信息。并決定編譯為什么。

BUILD_STATIC_LIBRARY:編譯為靜態(tài)庫(kù)。
BUILD_SHARED_LIBRARY :編譯為動(dòng)態(tài)庫(kù)
BUILD_EXECUTABLE:編譯為Native C可執(zhí)行程序

一、Android.mk文件的用途

一個(gè)android子項(xiàng)目中會(huì)存在一個(gè)或多個(gè)Android.mk文件

1、單一的Android.mk文件

直接參考NDK的sample目錄下的hello-jni項(xiàng)目,在這個(gè)項(xiàng)目中只有一個(gè)Android.mk文件

2、多個(gè)Android.mk文件

如果需要編譯的模塊比較多,我們可能會(huì)將對(duì)應(yīng)的模塊放置在相應(yīng)的目錄中,這樣,我們可以在每個(gè)目錄中定義對(duì)應(yīng)的Android.mk文件(類似于上面的寫法),最后,在根目錄放置一個(gè)Android.mk文件,內(nèi)容如下:

include $(call all-subdir-makefiles)

只需要這一行就可以了,它的作用就是包含所有子目錄中的Android.mk文件

3、多個(gè)模塊共用一個(gè)Android.mk

這個(gè)文件允許你將源文件組織成模塊,這個(gè)模塊中含有:

-靜態(tài)庫(kù)(.a文件)
-動(dòng)態(tài)庫(kù)(.so文件)

只有共享庫(kù)才能被安裝/復(fù)制到您的應(yīng)用軟件(APK)包中

include $(BUILD_STATIC_LIBRARY),編譯出的是靜態(tài)庫(kù)
include $(BUILD_SHARED_LIBRARY),編譯出的是動(dòng)態(tài)庫(kù)

二、自定義變量

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

-以 LOCAL_開(kāi)頭的名字(例如 LOCAL_MODULE)
-以 PRIVATE_, NDK_ 或 APP_開(kāi)頭的名字(內(nèi)部使用)
-小寫名字(內(nèi)部使用,例如‘my-dir')

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

MY_SOURCES := foo.c 
ifneq ($(MY_CONFIG_BAR),) 
MY_SOURCES += bar.c 
endif 
LOCAL_SRC_FILES += $(MY_SOURCES) 

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

三、GNU Make系統(tǒng)變量

這些 GNU Make變量在你的 Android.mk 文件解析之前,就由編譯系統(tǒng)定義好了。注意在某些情況下,NDK可能分析 Android.mk 幾次,每一次某些變量的定義會(huì)有不同。

(1)CLEAR_VARS: 指向一個(gè)編譯腳本,幾乎所有未定義的 LOCAL_XXX 變量都在"Module-description"節(jié)中列出。必須在開(kāi)始一個(gè)新模塊之前包含這個(gè)腳本:include$(CLEAR_VARS),用于重置除LOCAL_PATH變量外的,所有LOCAL_XXX系列變量。

(2)BUILD_SHARED_LIBRARY: 指向編譯腳本,根據(jù)所有的在 LOCAL_XXX 變量把列出的源代碼文件編譯成一個(gè)共享庫(kù)。

注意,必須至少在包含這個(gè)文件之前定義 LOCAL_MODULE 和 LOCAL_SRC_FILES。

(3)BUILD_STATIC_LIBRARY: 一個(gè) BUILD_SHARED_LIBRARY 變量用于編譯一個(gè)靜態(tài)庫(kù)。靜態(tài)庫(kù)不會(huì)復(fù)制到的APK包中,但是能夠用于編譯共享庫(kù)。

示例:include $(BUILD_STATIC_LIBRARY)

注意,這將會(huì)生成一個(gè)名為 lib$(LOCAL_MODULE).a 的文件

(4)TARGET_ARCH: 目標(biāo) CPU平臺(tái)的名字

(5)TARGET_PLATFORM: Android.mk 解析的時(shí)候,目標(biāo) Android 平臺(tái)的名字.詳情可考/development/ndk/docs/stable- apis.txt.

android-3 -> Official Android 1.5 system images 
android-4 -> Official Android 1.6 system images 
android-5 -> Official Android 2.0 system images 

(6)TARGET_ARCH_ABI: 暫時(shí)只支持兩個(gè) value,armeabi 和 armeabi-v7a。。

(7)TARGET_ABI: 目標(biāo)平臺(tái)和 ABI 的組合,

四、模塊描述變量

下面的變量用于向編譯系統(tǒng)描述你的模塊。應(yīng)該定義在'include $(CLEAR_VARS)'和'include $(BUILD_XXXXX)'之間。$(CLEAR_VARS)是一個(gè)腳本,清除所有這些變量。

(1)LOCAL_PATH: 這個(gè)變量用于給出當(dāng)前文件的路徑。

必須在 Android.mk 的開(kāi)頭定義,可以這樣使用:LOCAL_PATH := $(call my-dir)

如當(dāng)前目錄下有個(gè)文件夾名稱 src,則可以這樣寫 $(call src),那么就會(huì)得到 src 目錄的完整路徑

這個(gè)變量不會(huì)被$(CLEAR_VARS)清除,因此每個(gè) Android.mk 只需要定義一次(即使在一個(gè)文件中定義了幾個(gè)模塊的情況下)。

(2)LOCAL_MODULE: 這是模塊的名字,它必須是唯一的,而且不能包含空格。

必須在包含任一的$(BUILD_XXXX)腳本之前定義它。模塊的名字決定了生成文件的名字。

(3)LOCAL_SRC_FILES: 這是要編譯的源代碼文件列表。

只要列出要傳遞給編譯器的文件,因?yàn)榫幾g系統(tǒng)自動(dòng)計(jì)算依賴。注意源代碼文件名稱都是相對(duì)于 LOCAL_PATH的,你可以使用路徑部分,例如:

LOCAL_SRC_FILES := foo.c toto/bar.c\

Hello.c

文件之間可以用空格或Tab鍵進(jìn)行分割,換行請(qǐng)用"\"

如果是追加源代碼文件的話,請(qǐng)用LOCAL_SRC_FILES +=

注意:可以LOCAL_SRC_FILES := $(call all-subdir-java-files)這種形式來(lái)包含local_path目錄下的所有java文件。

(4)LOCAL_C_INCLUDES: 可選變量,表示頭文件的搜索路徑。

默認(rèn)的頭文件的搜索路徑是LOCAL_PATH目錄。

(5)LOCAL_STATIC_LIBRARIES: 表示該模塊需要使用哪些靜態(tài)庫(kù),以便在編譯時(shí)進(jìn)行鏈接。

(6)LOCAL_SHARED_LIBRARIES: 表示模塊在運(yùn)行時(shí)要依賴的共享庫(kù)(動(dòng)態(tài)庫(kù)),在鏈接時(shí)就需要,以便在生成文件時(shí)嵌入其相應(yīng)的信息。

注意:它不會(huì)附加列出的模塊到編譯圖,也就是仍然需要在Application.mk 中把它們添加到程序要求的模塊中。

(7)LOCAL_LDLIBS: 編譯模塊時(shí)要使用的附加的鏈接器選項(xiàng)。這對(duì)于使用‘-l'前綴傳遞指定庫(kù)的名字是有用的。

例如,LOCAL_LDLIBS := -lz表示告訴鏈接器生成的模塊要在加載時(shí)刻鏈接到/system/lib/libz.so

可查看 docs/STABLE-APIS.TXT 獲取使用 NDK發(fā)行版能鏈接到的開(kāi)放的系統(tǒng)庫(kù)列表。

(8)LOCAL_MODULE_PATH 和 LOCAL_UNSTRIPPED_PATH

在 Android.mk 文件中, 還可以用LOCAL_MODULE_PATH 和LOCAL_UNSTRIPPED_PATH指定最后的目標(biāo)安裝路徑.

不同的文件系統(tǒng)路徑用以下的宏進(jìn)行選擇:
TARGET_ROOT_OUT:表示根文件系統(tǒng)。
TARGET_OUT:表示 system文件系統(tǒng)。
TARGET_OUT_DATA:表示 data文件系統(tǒng)。
用法如:LOCAL_MODULE_PATH :=$(TARGET_ROOT_OUT)
至于LOCAL_MODULE_PATH 和LOCAL_UNSTRIPPED_PATH的區(qū)別,暫時(shí)還不清楚。

(9)LOCAL_JNI_SHARED_LIBRARIES:定義了要包含的so庫(kù)文件的名字,如果程序沒(méi)有采用jni,不需要

LOCAL_JNI_SHARED_LIBRARIES := libxxx 這樣在編譯的時(shí)候,NDK自動(dòng)會(huì)把這個(gè)libxxx打包進(jìn)apk; 放在youapk/lib/目錄下

五、NDK提供的函數(shù)宏

GNU Make函數(shù)宏,必須通過(guò)使用'$(call )'來(lái)調(diào)用,返回值是文本化的信息。

(1)my-dir:返回當(dāng)前 Android.mk 所在的目錄的路徑,相對(duì)于 NDK 編譯系統(tǒng)的頂層。這是有用的,在 Android.mk 文件的開(kāi)頭如此定義:

LOCAL_PATH := $(call my-dir)

(2)all-subdir-makefiles: 返回一個(gè)位于當(dāng)前'my-dir'路徑的子目錄中的所有Android.mk的列表。

例如,某一子項(xiàng)目的目錄層次如下:

src/foo/Android.mk
src/foo/lib1/Android.mk
src/foo/lib2/Android.mk

如果 src/foo/Android.mk 包含一行:

include $(call all-subdir-makefiles)

那么它就會(huì)自動(dòng)包含 src/foo/lib1/Android.mk 和 src/foo/lib2/Android.mk。

這項(xiàng)功能用于向編譯系統(tǒng)提供深層次嵌套的代碼目錄層次。

注意,在默認(rèn)情況下,NDK 將會(huì)只搜索在 src/*/Android.mk 中的文件。

(3)this-makefile: 返回當(dāng)前Makefile 的路徑(即這個(gè)函數(shù)調(diào)用的地方)

(4)parent-makefile: 返回調(diào)用樹(shù)中父 Makefile 路徑。即包含當(dāng)前Makefile的Makefile 路徑。

(5)grand-parent-makefile:返回調(diào)用樹(shù)中父Makefile的父Makefile的路徑

六、 Android.mk示例

#編譯靜態(tài)庫(kù) 
LOCAL_PATH := $(call my-dir) 
include $(CLEAR_VARS) 
LOCAL_MODULE = libhellos 
LOCAL_CFLAGS = $(L_CFLAGS) 
LOCAL_SRC_FILES = hellos.c 
LOCAL_C_INCLUDES = $(INCLUDES) 
LOCAL_SHARED_LIBRARIES := libcutils 
LOCAL_COPY_HEADERS_TO := libhellos 
LOCAL_COPY_HEADERS := hellos.h 
include $(BUILD_STATIC_LIBRARY) 
#編譯動(dòng)態(tài)庫(kù) 
LOCAL_PATH := $(call my-dir) 
include $(CLEAR_VARS) 
LOCAL_MODULE = libhellod 
LOCAL_CFLAGS = $(L_CFLAGS) 
LOCAL_SRC_FILES = hellod.c 
LOCAL_C_INCLUDES = $(INCLUDES) 
LOCAL_SHARED_LIBRARIES := libcutils 
LOCAL_COPY_HEADERS_TO := libhellod 
LOCAL_COPY_HEADERS := hellod.h 
include $(BUILD_SHARED_LIBRARY) 
#使用靜態(tài)庫(kù) 
LOCAL_PATH := $(call my-dir) 
include $(CLEAR_VARS) 
LOCAL_MODULE := hellos 
LOCAL_STATIC_LIBRARIES := libhellos 
LOCAL_SHARED_LIBRARIES := 
LOCAL_LDLIBS += -ldl 
LOCAL_CFLAGS := $(L_CFLAGS) 
LOCAL_SRC_FILES := mains.c 
LOCAL_C_INCLUDES := $(INCLUDES) 
include $(BUILD_EXECUTABLE) 
#使用動(dòng)態(tài)庫(kù) 
LOCAL_PATH := $(call my-dir) 
include $(CLEAR_VARS) 
LOCAL_MODULE := hellod 
LOCAL_MODULE_TAGS := debug 
LOCAL_SHARED_LIBRARIES := libc libcutils libhellod 
LOCAL_LDLIBS += -ldl 
LOCAL_CFLAGS := $(L_CFLAGS) 
LOCAL_SRC_FILES := maind.c 
LOCAL_C_INCLUDES := $(INCLUDES) 
include $(BUILD_EXECUTABLE) 

相關(guān)文章

  • Android?TextView的maxEms和maxLength屬性區(qū)別

    Android?TextView的maxEms和maxLength屬性區(qū)別

    這篇文章主要為大家介紹了Android?TextView的maxEms和maxLength屬性區(qū)別,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • Android自定義attr的各種坑

    Android自定義attr的各種坑

    開(kāi)發(fā)過(guò)程中經(jīng)常會(huì)自定義View來(lái)實(shí)現(xiàn)各種各樣炫酷的效果,在實(shí)現(xiàn)這些效果的同時(shí),我們往往會(huì)定義很多attr屬性這篇文章主要介紹了Android自定義attr的各種坑,需要的朋友可以參考下
    2016-04-04
  • Android Studio調(diào)試功能使用匯總

    Android Studio調(diào)試功能使用匯總

    這篇文章主要為大家詳細(xì)介紹了Android Studio調(diào)試功能使用方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • Android虛擬機(jī)與類加載機(jī)制詳情

    Android虛擬機(jī)與類加載機(jī)制詳情

    這篇文章主要介紹了Android虛擬機(jī)與類加載機(jī)制詳情,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-09-09
  • Android 個(gè)人理財(cái)工具三:添加賬單頁(yè)面 上

    Android 個(gè)人理財(cái)工具三:添加賬單頁(yè)面 上

    本文主要介紹Android 個(gè)人理財(cái)工具添加賬單頁(yè)面的功能實(shí)現(xiàn),這里提供實(shí)例代碼和實(shí)現(xiàn)效果圖,有興趣的小伙伴可以參考下
    2016-08-08
  • Android常用正則表達(dá)式驗(yàn)證工具類(實(shí)例代碼)

    Android常用正則表達(dá)式驗(yàn)證工具類(實(shí)例代碼)

    正則表達(dá)式,相信接觸過(guò)編程的人都知道,但是大部分人應(yīng)該是每次用的時(shí)候現(xiàn)找,但對(duì)其語(yǔ)法應(yīng)該只是一知半解 。下面小編給大家分享Android常用正則表達(dá)式驗(yàn)證工具類,感興趣的朋友一起看看吧
    2017-10-10
  • Android Service總結(jié)及詳細(xì)介紹

    Android Service總結(jié)及詳細(xì)介紹

    本文主要介紹Android Service的知識(shí),這里整理了詳細(xì)資料及簡(jiǎn)單實(shí)現(xiàn)示例代碼,有需要的小伙伴可以參考下
    2016-09-09
  • android dialog背景模糊化效果實(shí)現(xiàn)方法

    android dialog背景模糊化效果實(shí)現(xiàn)方法

    這篇文章主要為大家詳細(xì)介紹了android dialog背景模糊化效果的實(shí)現(xiàn)方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-04-04
  • Android自定義下拉刷新上拉加載

    Android自定義下拉刷新上拉加載

    這篇文章主要為大家詳細(xì)介紹了Android自定義下拉刷新上拉加載的相關(guān)資料,需要的朋友可以參考下
    2016-05-05
  • Android  RecyclerView詳解及簡(jiǎn)單實(shí)例

    Android RecyclerView詳解及簡(jiǎn)單實(shí)例

    這篇文章主要介紹了Android RecyclerView詳解及簡(jiǎn)單實(shí)例的相關(guān)資料,需要的朋友可以參考下
    2017-01-01

最新評(píng)論