Android.mk用法详解
Android.mk是Android提供的一個(gè)makefile文件,可以將源文件分組為模塊。用來(lái)引用的頭文件目錄、需要編譯的*.c/.cpp文件、jni源文件、指定編譯生成.so共享庫(kù)文件或者*.a靜態(tài)庫(kù)文件,可以定義一個(gè)或多個(gè)模塊,也可以多個(gè)模塊中使用同一個(gè)源文件;
Android.mk文檔:
基礎(chǔ)知識(shí):
1.LOCAL_PATH := $(call my-dir)
每個(gè)Android.mk文件都以LOCAL_PATH開始,Build System提供的宏函數(shù) my-dir,此變量返回包含的makefile的路徑;CLEAR_VARS不會(huì)清楚LOCAL_PATH變量;
NDK提供的宏函數(shù);
2. include $(CLEAR_VARS):
CLEAR_VARS變量由Build System提供,并指向一個(gè)特定的GNU Makefile,可為你清除LOCAL_xxx變量,但不會(huì)清除LOCAL_PATH變量;
因系統(tǒng)在單一GNU Make執(zhí)行環(huán)境中解析所有構(gòu)建控制文件,LOCAL_xxx變量是全局的,所以描述每個(gè)模塊之前,聲明此變量,可以清除所有了LOCAL_xxx,這樣清理后避免相互影響;
3.LOCAL_MODULE
此變量聲明模塊名稱,名稱必須唯一且不含任何空格;
Build System在生成最終共享庫(kù)文件時(shí),會(huì)將"lib"作為前綴+模塊名稱+".so"作為共享庫(kù)文件名稱;
eg:LOCAL_MODULE := ffmpeg-decoder
模塊名稱為ffmpeg-decoder生成共享庫(kù)為libffmpeg-decoder.so;
4. LOCAL_SRC_FILES := FFmpegDecoder.cpp FFmpegConfigure.cpp
此變量必須包含要構(gòu)建到模塊中的C/C++源文件列表,不需要列出頭文件和包含文件,系統(tǒng)會(huì)自動(dòng)導(dǎo)入依賴;
eg: LOCAL_SRC_FILES := FFmpegDecoder.cpp FFmpegConfigure.cpp
5. LOCAL_C_INCLUDES
變量設(shè)置頭文件的include目錄列表;
eg: LOCAL_C_INCLUDES += (LOCALPATH)/include6.LOCALLDLIBS此變量包含構(gòu)建共享庫(kù)或可執(zhí)行文件時(shí)鏈接庫(kù),使用?l前綴傳遞特定系統(tǒng)庫(kù)的名稱,多個(gè)鏈接庫(kù)之間使用空格作為分隔符;NDK為Android版本提供新的頭文件和庫(kù),文件路徑:(LOCAL_PATH)/include 6. LOCAL_LDLIBS 此變量包含構(gòu)建共享庫(kù)或可執(zhí)行文件時(shí)鏈接庫(kù),使用-l前綴傳遞特定系統(tǒng)庫(kù)的名稱,多個(gè)鏈接庫(kù)之間使用空格作為分隔符; NDK為Android版本提供新的頭文件和庫(kù),文件路徑:(LOCALP?ATH)/include6.LOCALL?DLIBS此變量包含構(gòu)建共享庫(kù)或可執(zhí)行文件時(shí)鏈接庫(kù),使用?l前綴傳遞特定系統(tǒng)庫(kù)的名稱,多個(gè)鏈接庫(kù)之間使用空格作為分隔符;NDK為Android版本提供新的頭文件和庫(kù),文件路徑:NDK/platforms/android-//usr/include下;
-llog鏈接到系統(tǒng)的liblog.so文件,應(yīng)用可以定義從原生代碼向內(nèi)核發(fā)送日志消息,路徑:/system/lib/liblog.so,其實(shí)是導(dǎo)入<android/log.h>頭文件,路徑:$NDK/platforms/android-3/arch-arm/usr/include/android/log.h
變量列表:
-llog(日志庫(kù)):導(dǎo)入log.h頭文件
-lz(ZLib壓縮庫(kù)):添加zlib.h和zconf.h頭文件;
-ldl(動(dòng)態(tài)鏈接器庫(kù)):添加dlfcn.h頭文件,可以訪問Android動(dòng)態(tài)鏈接器的dlopen()、dlsym()和dlclose()函數(shù);
-lGLESv3(OpenGL ES3.1庫(kù)):此變量API 21開始,添加gl31.h和gl3ext.h頭文件,提供了渲染機(jī)制,參考EGL原生平臺(tái)接口;從API 9開始提供EGL API,可以使用GLSurfaceView;
-ljnigraphics:允許C/C++以可靠方式訪問Java位圖對(duì)象的像素緩沖區(qū),導(dǎo)入bitmap.h頭文件,jnigraphics工作流程參考:NDK API中的jnigraphics;
-lOpenMAXAL(多媒體庫(kù)):導(dǎo)入OMXAL/OpenMAXAL.h和OMXAL/OpenMAXAL_Platform.h頭文件,提供原生多媒體處理庫(kù);
-landroid(android原生頭文件庫(kù)): 原生頭文件列表包括native_activity.h、looper.h、input.h、keycodes.h等等,如需了解頭文件詳情參考:NDK API參考文檔;
https://developer.android.google.cn/ndk/guides/stable_apis
eg:LOCAL_LDLIBS := -llog -lz
7. LOCAL_SHARED_LIBRARIES := avcodec avdevice
此變量是此模塊運(yùn)行中依賴的共享庫(kù)模塊列表,avcodec和avdevice都是前面定義的共享模塊庫(kù);
eg:
8. include $(BUILD_SHARED_LIBRARY)
此變量設(shè)置Build System提供的變量執(zhí)行GNU Makefile腳本,表示指定模塊的生成方式;
BUILD_SHARED_LIBARAY:編譯為動(dòng)態(tài)庫(kù);
BUILD_SHARED_LIBRARY:編譯為動(dòng)態(tài)庫(kù)(.so),這里的LOCAL_SRC_FILES的值為.c/.cpp;
BUILD_STATIC_LIBRARY:編譯為靜態(tài)庫(kù)(.a),這里的LOCAL_SRC_FILES的值為*.c/.cpp;
BUILD_EXECUTABLE:編譯為Native C可執(zhí)行程序;
PREBUILT_SHARED_LIBRARY:編譯為動(dòng)態(tài)庫(kù)(.so),與BUILD_SHARED_LIBRARY不同,這里L(fēng)OCAL_SRC_FILES的值不能是源文件,而是庫(kù)文件;
PREBUILD_STATIC_LIBRARY:編譯靜態(tài)庫(kù);
9:TARGET_PLATFORM、TARGET_ARCH_ABI和TARGET_ABI
TARGET_PLATFORM:構(gòu)建系統(tǒng)目標(biāo)的Android API level;
eg:TARGET_PLATFORM := android-22
TARGET_ARCH_ABI :此變量將CPU和架構(gòu)的ABI存儲(chǔ)到目標(biāo);eg:TARGET_ARCH_ABI := arm64-v8a
TARGET_ABI:設(shè)置Android API level和ABI的聯(lián)結(jié);
eg:TARGET_ABI := android-22-arm64-v8a
注:Android.mk中的TARGET_xxx與Application.mk中的APP_xxx中的變量設(shè)置相似;
模塊只設(shè)置LOCAL_MODULE而不設(shè)置LOCAL_MODULE_FILENAME,就會(huì)以“l(fā)ib”前綴+module名稱+“.so”命名生成的動(dòng)態(tài)庫(kù)名稱,如果我們需要自己設(shè)置生成動(dòng)態(tài)庫(kù)名稱就可以通過LOCAL_MODULE_FILENAME進(jìn)行設(shè)置;
此變量設(shè)置C++源文件以外的文件擴(kuò)展名;
eg:LOCAL_CPP_EXTENSION := .cxx .cpp .cc .c
12.LOCAL_CPP_FEATURES
此變量指明代碼依賴于特定的C++功能;
eg:LOCAL_CPP_FEATURES := rtti exceptions features
rtti:指明使用RTTI(運(yùn)行時(shí)類型信息);
exceptions:指明代碼使用C++異常;
此變量指定相對(duì)于NDK root目錄的路徑列表,在編譯所有源文件(C、C++和Assembly)時(shí)添加到include搜索路徑;
此變量指定生成ARM目標(biāo)二進(jìn)制文件;
此變量設(shè)置支持NEON,
eg: LOCAL_ARM_NEON := true
此變量設(shè)置為true,構(gòu)建靜態(tài)庫(kù)時(shí)生成一個(gè)只包含實(shí)際對(duì)象的文件路徑而不包含對(duì)象的庫(kù),好處是庫(kù)文件變小了,但是不能進(jìn)行移植,因?yàn)樗械穆窂绞窍鄬?duì)路徑.
總結(jié)
以上是生活随笔為你收集整理的Android.mk用法详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2022延迟退休表格,男女退休年龄对照表
- 下一篇: 编译Android版本TensorFlo