一個(gè)Android.mk file用來向編譯系統(tǒng)描述你的源代碼。具體來說:該文件是GNU Makefile的一小部分,會(huì)被編譯系統(tǒng)解析一次或多次。你可以在每一個(gè)Android.mk file中定義一個(gè)或多個(gè)模塊,你也可以在幾個(gè)模塊中使用同一個(gè)源代碼文件。編譯系統(tǒng)為你處理許多細(xì)節(jié)問題。例如,你不需要在你的Android.mk中列出頭文件和依賴文件。NDK編譯系統(tǒng)將會(huì)為你自動(dòng)處理這些問題。這也意味著,在升級(jí)NDK后,你應(yīng)該得到新的toolchain/platform支持,而且不需要改變你的Android.mk文件。

我們提供的服務(wù)有:成都網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)、外貿(mào)網(wǎng)站建設(shè)、微信公眾號(hào)開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、寧陵ssl等。為上千多家企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的寧陵網(wǎng)站制作公司
先看一個(gè)簡(jiǎn)單的例子:一個(gè)簡(jiǎn)單的"hello world",比如下面的文件:
sources/helloworld/helloworld.c
sources/helloworld/Android.mk
相應(yīng)的Android.mk文件會(huì)象下面這樣:
---------- cut here ------------------
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE
:= helloworld
LOCAL_SRC_FILES := helloworld.c
include $(BUILD_SHARED_LIBRARY)
---------- cut here ------------------
我們來解釋一下這幾行代碼:
LOCAL_PATH := $(call my-dir)
一個(gè)Android.mk file首先必須定義好LOCAL_PATH變量。它用于在開發(fā)樹中查找源文件。在這個(gè)例子中,宏函數(shù)’my-dir’, 由編譯系統(tǒng)提供,用于返回當(dāng)前路徑(即包含Android.mk file文件的目錄)。
include $( CLEAR_VARS)
CLEAR_VARS由編譯系統(tǒng)提供,指定讓GNU MAKEFILE為你清除許多LOCAL_XXX變量(例如 LOCAL_MODULE, LOCAL_SRC_FILES, LOCAL_STATIC_LIBRARIES, 等等...),除LOCAL_PATH 。這是必要的,因?yàn)樗械木幾g控制文件都在同一個(gè)GNU MAKE執(zhí)行環(huán)境中,所有的變量都是全局的。
LOCAL_MODULE := helloworld
LOCAL_MODULE變量必須定義,以標(biāo)識(shí)你在Android.mk文件中描述的每個(gè)模塊。名稱必須是唯一的,而且不包含任何空格。注意編譯系統(tǒng)會(huì)自動(dòng)產(chǎn)生合適的前綴和后綴,換句話說,一個(gè)被命名為'foo'的共享庫模塊,將會(huì)生成'libfoo.so'文件。
LOCAL_SRC_FILES := helloworld.c
LOCAL_SRC_FILES變量必須包含將要編譯打包進(jìn)模塊中的C或C++源代碼文件。注意,你不用在這里列出頭文件和包含文件,因?yàn)榫幾g系統(tǒng)將會(huì)自動(dòng)為你找出依賴型的文件;僅僅列出直接傳遞給編譯器的源代碼文件就好。
在Android中增加本地程序或者庫,這些程序和庫與其所載路徑?jīng)]有任何關(guān)系,只和它們的Android.mk文件有關(guān)系。Android.mk和普通的Makefile有所不同,它具有統(tǒng)一的寫法,主要包含一些系統(tǒng)公共的宏。
在一個(gè)Android.mk中可以生成多個(gè)可執(zhí)行程序、動(dòng)態(tài)庫和靜態(tài)庫。
1,編譯應(yīng)用程序的模板:
#Test Exe
LOCAL_PATH := $(call my-dir)
#include $(CLEAR_VARS)
LOCAL_SRC_FILES:= main.c
LOCAL_MODULE:= test_exe
#LOCAL_C_INCLUDES :=
#LOCAL_STATIC_LIBRARIES :=
#LOCAL_SHARED_LIBRARIES :=
include $(BUILD_EXECUTABLE)
(菜鳥級(jí)別解釋::=是賦值的意思,$是引用某變量的值)LOCAL_SRC_FILES中加入源文件路徑,LOCAL_C_INCLUDES 中加入所需要包含的頭文件路徑,LOCAL_STATIC_LIBRARIES加入所需要鏈接的靜態(tài)庫(*.a)的名稱,LOCAL_SHARED_LIBRARIES中加入所需要鏈接的動(dòng)態(tài)庫(*.so)的名稱,LOCAL_MODULE表示模塊最終的名稱,BUILD_EXECUTABLE表示以一個(gè)可執(zhí)行程序的方式進(jìn)行編譯。
2,編譯靜態(tài)庫的模板:
#Test Static Lib
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES:= /
helloworld.c
LOCAL_MODULE:= libtest_static
#LOCAL_C_INCLUDES :=
#LOCAL_STATIC_LIBRARIES :=
#LOCAL_SHARED_LIBRARIES :=
include $(BUILD_STATIC_LIBRARY)
一般的和上面相似,BUILD_STATIC_LIBRARY表示編譯一個(gè)靜態(tài)庫。
3,編譯動(dòng)態(tài)庫的模板:
#Test Shared Lib
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES:= /
helloworld.c
LOCAL_MODULE:= libtest_shared
TARGET_PRELINK_MODULES := false
#LOCAL_C_INCLUDES :=
#LOCAL_STATIC_LIBRARIES :=
#LOCAL_SHARED_LIBRARIES :=
include $(BUILD_SHARED_LIBRARY)
一般的和上面相似,BUILD_SHARED_LIBRARY表示編譯一個(gè)靜態(tài)庫。
以上三者的生成結(jié)果分別在如下,generic依具體target會(huì)變:
out/target/product/generic/obj/EXECUTABLE
out/target/product/generic/obj/STATIC_LIBRARY
out/target/product/generic/obj/SHARED_LIBRARY
每個(gè)模塊的目標(biāo)文件夾分別為:
可執(zhí)行程序:XXX_intermediates
靜態(tài)庫: XXX_static_intermediates
動(dòng)態(tài)庫: XXX_shared_intermediates
另外,在Android.mk文件中,還可以指定最后的目標(biāo)安裝路徑,用LOCAL_MODULE_PATH和LOCAL_UNSTRIPPED_PATH來指定。不同的文件系統(tǒng)路徑用以下的宏進(jìn)行選擇:
TARGET_ROOT_OUT:表示根文件系統(tǒng)。
TARGET_OUT:表示system文件系統(tǒng)。
TARGET_OUT_DATA:表示data文件系統(tǒng)。
用法如:
CAL_MODULE_PATH:=$(TARGET_ROOT_OUT)
方向盤左下方有一個(gè)可調(diào)節(jié)的旋轉(zhuǎn)開關(guān),就是大燈高度調(diào)節(jié)開關(guān)。現(xiàn)在,又有一款內(nèi)置安卓系統(tǒng)的USB便攜電腦Android 4.0 mini PC面世,即Zero Devices Z900。
MK802另一個(gè)型號(hào)名是Z802,而Zero Devices這次推出的Z900就是MK802的升級(jí)版,其他方面,Zero Devices Z900采用獨(dú)特的外殼設(shè)計(jì),內(nèi)置512MB內(nèi)存和4GB存儲(chǔ)空間。
提供microSD卡插槽和HDMI、USB、mini USB接口尺寸為89×32×18毫米,重量為38克。
Zero Devices Z900將運(yùn)行Android 4.0冰淇淋三明治系統(tǒng),如果你需要,還可以刷Android 2.3甚至是Linux系統(tǒng),和MK802一樣,用戶可以通過HDMI接口連接外置顯示器,再通過USB接口連接鼠標(biāo)或鍵盤。
至于Z900的上市時(shí)間和價(jià)格,暫時(shí)還沒有消息,不過將有黑白兩色選擇。
Z9002022款大燈高度調(diào)節(jié)
前照燈高度調(diào)節(jié)旋鈕通常位于儀表板的左側(cè)和燈光控制開關(guān)的一側(cè)旋鈕上一般有0到3的數(shù)字,數(shù)字越高,高度越低大多數(shù)情況下,0的位置就可以了。
0為初始位置和水平高度,適用于前排有人,行李空裝載的情況1-3檔適用于車滿行李滿的情況。
大燈高度可調(diào)一般車內(nèi)有一個(gè)手動(dòng)調(diào)節(jié)旋鈕,可以隨意調(diào)節(jié)大燈的照明高度,但有些高端豪華車的大燈是自動(dòng)水平調(diào)節(jié)的。
對(duì)于大燈高度自動(dòng)調(diào)節(jié)的車輛,車身會(huì)配備多個(gè)傳感器,可以檢測(cè)車輛的動(dòng)態(tài)平衡,并根據(jù)預(yù)設(shè)程序調(diào)節(jié)光束角度,但同時(shí)也有一定的局限性,不能根據(jù)實(shí)際需要改變,需要人工干預(yù)。
變量
1
LOCAL_PATH := $(call my-dir)
1、解釋 LOCAL_PATH:
英文:如下圖
中文:Android.mk 開始必須定義變量 LOCAL_PATH,它用來指定源文件的位置
2、解釋 my-dir:
英文:如下圖
中文:編譯系統(tǒng)提供的'my-dir'宏函數(shù),被用來獲取當(dāng)前的目錄。
2
include $(CLEAR_VARS)
1、解釋 CLEAR_VARS:
英文:如下圖
中文:編譯系統(tǒng)提供CLEAR_VARS變量,它指向了一個(gè)用來清除 LOCAL_ 開頭的變量(LOCAL_PATH除外)的makefile文件,需要它的原因是整個(gè)的編譯上下文中,所有的變量都是全局的,這樣就可以保證這些變量只在局部范圍內(nèi)起作用;
3
LOCAL_MODULE := hello-jni
1、解釋 LOCAL_MODULE:
英文:如下圖
中文:每一個(gè)android.mk文件中都必須定義一個(gè)模塊標(biāo)示 LOCAL_MODULE , 這個(gè)名字必須是唯一的并且不包含任何的空格,編譯系統(tǒng)將自動(dòng)的修改生成文件的前綴和后綴,如一個(gè)模塊為'foo'共享庫將被改為'libfoo.so';
重要提示,如果你的模塊名為'libfoo',編譯系統(tǒng)生成的文件為 'libfoo.so', 而不會(huì)去再增加前綴,當(dāng)你使用的時(shí)候,android平臺(tái)會(huì)自動(dòng)識(shí)別;
4
LOCAL_SRC_FILES := hello-jni.c
1、解釋 LOCAL_SRC_FILES
英文:如下圖
中文:LOCAL_SRC_FILES必須包含一系列的C/C++源文件,他們將會(huì)被建立和裝載到模塊中,注意你不應(yīng)該把需要包含的頭文件列在這里,因?yàn)榻⑾到y(tǒng)將自動(dòng)計(jì)算依賴項(xiàng),只有源文件才能夠被編譯器識(shí)別;
2、解釋 LOCAL_CPP_EXTENSION
英文:如下圖
中文:注意默認(rèn)的c++文件擴(kuò)展名是'.cpp', LOCAL_CPP_EXTENSION可以用來指定不同類型的擴(kuò)展名,不要忘了前面的點(diǎn)(如:'.cxx' 將起作用, 但是 'cxx'不會(huì)起作用).
如:LOCAL_CPP_EXTENSION := .cc .cpp
5
include $(BUILD_SHARED_LIBRARY)
1、解釋 BUILD_SHARED_LIBRARY
英文:如下圖
中文:‘建立系統(tǒng)’提供個(gè)變量 BUILD_SHARED_LIBRARY, 將根據(jù)在‘include’之前定義的所有的信息和LOCAL_前綴的變量,決定將建立什么,如何正確的生成共享庫;
2、解釋 BUILD_STATIC_LIBRARY
英文: 如下圖
中文: 同上,只不過它生成的是靜態(tài)庫
6
LOCAL_C_INCLUDES := $(NDK_ROOT)/sources/third_party/freetype
1、解釋 NDK_ROOT
中文:NDK_ROOT 代表的是ndk的根目錄,如我的是“D:\Android\android-ndk-r10”,這個(gè)例子是用來加載ndk根目錄下的freetype的頭文件路徑;
7
LOCAL_LDFLAGS := \
$(LOCAL_PATH)/libs/$(TARGET_ARCH_ABI)/libfreetype.a
1、解釋 LOCAL_LDFLAGS
中文:用來加載用戶自己的靜態(tài)庫(.a文件)
2、解釋 TARGET_ARCH_ABI
中文:當(dāng)前的cpu/abi的類型,在鏈接不同類型的CPU_ABI時(shí)非常有用,如下圖
8
$(call import-add-path,$(LOCAL_PATH)/libsrc)
1、解釋:import-add-path
中文:增加自己的路徑到 NDK_MODULE_PATH 環(huán)境變量中,再非ndk根目錄/sources下編譯時(shí)會(huì)用到
9
LOCAL_SRC_FILES := hello-jni.c HelloJni.cpp
$(error $(LOCAL_SRC_FILES))
1、解釋:$
中文:變量前面加上"$"用來返回變量的值
2、解釋:$(error string)
中文:用來將string所對(duì)應(yīng)的內(nèi)容打印到控制臺(tái),并且android.mk文件停止繼續(xù)進(jìn)行編譯,如下圖
10
LOCAL_SRC_FILES := hello-jni.c HelloJni.cpp
$(warning $(LOCAL_SRC_FILES))
1、解釋:$(warning string)
中文:用來將string所對(duì)應(yīng)的內(nèi)容打印到控制臺(tái),并且android.mk文件將繼續(xù)進(jìn)行編譯,如下圖
11
LOCAL_PRELINK_MODULE := false
1、解釋 LOCAL_PRELINK_MODULE:
中文:關(guān)閉編譯器鏈接前進(jìn)行代碼優(yōu)化,防止將沒有用到的代碼不添加到生成的庫中
12
LOCAL_EXPORT_CFLAGS := -DFOO=1
1、解釋 LOCAL_EXPORT_CFLAGS
定義這個(gè)變量來記錄一些列的 c/c++編譯標(biāo)志,他們將會(huì)增加到其他的使用這個(gè)模塊的LOCAL_CFLAGS中,LOCAL_CFLAGS的功能相當(dāng)于:LOCAL_STATIC_LIBRARIES 和 LOCAL_SHARED_LIBRARIES 這兩個(gè)變量;
13
LOCAL_STATIC_LIBRARIES := foo
1、解釋 LOCAL_STATIC_LIBRARIES
鏈接進(jìn)來一個(gè)靜態(tài)庫的模塊,這里是靜態(tài)庫的模塊的名稱,而不是靜態(tài)庫的名稱
14
LOCAL_SHARED_LIBRARIES
鏈接進(jìn)來一個(gè)動(dòng)態(tài)庫的模塊,這里是動(dòng)態(tài)庫的模塊的名稱,而不是靜態(tài)庫的名稱
15
LOCAL_EXPORT_CPPFLAGS
跟 LOCAL_EXPORT_CFLAGS 的功能一樣,但是它只能夠在c++中使用
16
LOCAL_EXPORT_C_INCLUDES
跟 LOCAL_EXPORT_CFLAGS,但是對(duì)于c的 include路徑,被調(diào)用模塊申明后,使用模塊可以很方便的使用包含的路徑
17
LOCAL_EXPORT_LDFLAGS
跟LOCAL_EXPORT_CFLAGS的作用一樣,但是僅僅是鏈接選項(xiàng)
18
LOCAL_EXPORT_LDLIBS
跟LOCAL_EXPORT_CFLAGS的作用類似,但是這個(gè)變量說明的系統(tǒng)庫,需要帶上 '-l' 前綴,他們將導(dǎo)入鏈接器選項(xiàng),并追加到你的模塊的 LOCAL_LDLIBS
19
LOCAL_ALLOW_UNDEFINED_SYMBOLS := true
允許未定義的符號(hào)
20
LOCAL_CFLAGS
.c文件對(duì)應(yīng)的編譯標(biāo)記變量
21
LOCAL_LDLIBS
用來鏈接共享庫(so)或者執(zhí)行文件,使用系統(tǒng)的庫文件的時(shí)候,需要加上前綴 '-l',例如下面的例子,將告訴連接器生成的模塊的時(shí)候同時(shí)鏈接 /system/lib/libz.so
LOCAL_LDLIBS := -lz
注意:如果你在一個(gè)模塊中鏈接一個(gè)靜態(tài)庫,這個(gè)靜態(tài)庫是不會(huì)起作用的,同時(shí)ndk-build 會(huì)打印出一條警告消息
22
LOCAL_CFLAGS := -fvisibility=hidden
隱藏庫函數(shù)名
23
LOCAL_PROGUARD_ENABLED默認(rèn)是打開的,不特別指定的話,就是起作用的,就可能做優(yōu)化。
LOCAL_PROGUARD_ENABLED:= disabled
在Linux下,可以通過Makefile來對(duì)源碼工程進(jìn)行管理,Android.mk文件是Makefile的一小部分,它用來對(duì)Android程序進(jìn)行編譯。Android.mk文件中描述了哪些C文件將被編譯且指明了如何編譯。Android.mk文件用來告知NDK Build 系統(tǒng)關(guān)于Source的信息。
1、編譯可執(zhí)行程序
2、編譯動(dòng)態(tài)庫或靜態(tài)庫
3、預(yù)編譯文件(APK或Java庫)
以上三種是Android.mk的主要用法,我們寫mk文件時(shí)也就是以上三種目的。
首先看一個(gè)最簡(jiǎn)單的Android.mk的例子:
講解:
每個(gè)Android.mk文件必須以定義 LOCAL_PATH 為開始。它用于在開發(fā)tree中查找源文件。
宏 my-dir 由Build System提供。返回包含Android.mk的目錄路徑。
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 模塊必須定義,以表示Android.mk中的每一個(gè)模塊。名字必須唯一且不包含空格。
Build System會(huì)自動(dòng)添加適當(dāng)?shù)那熬Y和后綴。例如,foo,要產(chǎn)生動(dòng)態(tài)庫,則生成libfoo.so.
但請(qǐng)注意:如果模塊名被定為:libfoo.則生成libfoo.so. 不再加前綴。
LOCAL_SRC_FILES變量必須包含將要打包如模塊的C/C++ 源碼。
不必列出頭文件,build System 會(huì)自動(dòng)幫我們找出依賴文件。
缺省的C++源碼的擴(kuò)展名為.cpp. 也可以修改,通過LOCAL_CPP_EXTENSION。
BUILD_SHARED_LIBRARY:是Build System提供的一個(gè)變量,指向一個(gè)GNU Makefile Script。
它負(fù)責(zé)收集自從上次調(diào)用include $(CLEAR_VARS) 后的所有LOCAL_XXX信息。并決定編譯為什么。
BUILD_STATIC_LIBRARY:編譯為靜態(tài)庫。
BUILD_SHARED_LIBRARY :編譯為動(dòng)態(tài)庫
BUILD_EXECUTABLE:編譯為Native C可執(zhí)行程序
BUILD_PACKAGE(既可以編apk,也可以編資源包文件,但是需要指定LOCAL_EXPORT_PACKAGE_RESOURCES:=true)
BUILD_JAVA_LIBRARY(Java共享庫)
BUILD_STATIC_JAVA_LIBRARY(java靜態(tài)庫)
Android源碼中有大量的mk文件,Android系統(tǒng)的編譯就是靠著這些mk文件的,所以學(xué)好是非常有必要的哦!
當(dāng)你需要使用JNI的時(shí)候,你需要?jiǎng)?chuàng)建一個(gè)native工程。Android.mk就是一個(gè)makefile配置文件,幫你把C/C++的代碼編譯成動(dòng)態(tài)庫so的。
創(chuàng)建的方式有兩種:
在工程根目錄里手動(dòng)創(chuàng)建一個(gè)目錄叫jni,在里面新建一個(gè)Android.mk,然后創(chuàng)建c,cpp文件,把他們配置到Android.mk里。
右鍵工程,選擇Android Tools-Add Native Support自動(dòng)生成。
擴(kuò)展資料:
創(chuàng)建Android庫
Android 庫在結(jié)構(gòu)上與 Android 應(yīng)用模塊相同。可以提供構(gòu)建應(yīng)用所需的一切內(nèi)容,包括源代碼、資源文件和 Android 清單。
不過,Android 庫將編譯到可以用作 Android 應(yīng)用模塊依賴項(xiàng)的 Android 歸檔 (AAR:Android Archive Resource) 文件,而不是在設(shè)備上運(yùn)行的 APK。
與 JAR 文件不同,AAR 文件可以包含 Android 資源和一個(gè)清單文件,這樣,除了 Java 類與方法外,還可以捆綁布局和可繪制對(duì)象等共享資源。
庫模塊在以下情況下非常有用:
構(gòu)建使用某些相同組件(例如 Activity、服務(wù)或 UI 布局)的多個(gè)應(yīng)用。
構(gòu)建存在多個(gè) APK 變體(例如免費(fèi)版本和付費(fèi)版本)的應(yīng)用并且需要在兩種版本中使用相同的核心組件。
參考資料來源:百度百科-Android
分享文章:android.mk,androidmk99
標(biāo)題來源:http://chinadenli.net/article47/dseicej.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供自適應(yīng)網(wǎng)站、網(wǎng)站排名、App開發(fā)、品牌網(wǎng)站制作、網(wǎng)站設(shè)計(jì)、搜索引擎優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)