Android.mk是Android提供的一個makefile文件,可以將源文件分組為模塊进肯。用來引用的頭文件目錄安聘、需要編譯的.c/.cpp文件、jni源文件友存、指定編譯生成*.so共享庫文件或者*.a靜態(tài)庫文件,可以定義一個或多個模塊陶衅,也可以多個模塊中使用同一個源文件屡立;
一、Android.mk文檔
- Android.mk的官方文檔https://developer.android.google.cn/ndk/guides/android_mk
- 在NDK中的文檔路徑
ndk目錄下docs中的ANDROID-MK.html文檔搀军,eg:android-ndk-r9d/docs/ANDROID-MK.html;
二侠驯、基礎(chǔ)知識:
- LOCAL_PATH := $(call my-dir)
每個Android.mk文件都以LOCAL_PATH開始,Build System提供的宏函數(shù) my-dir奕巍,此變量返回包含的makefile的路徑吟策;
CLEAR_VARS不會清楚LOCAL_PATH變量;
- include $(CLEAR_VARS):
CLEAR_VARS變量由Build System提供的止,并指向一個特定的GNU Makefile檩坚,可為你清除LOCAL_xxx變量,但不會清除LOCAL_PATH變量诅福;
因系統(tǒng)在單一GNU Make執(zhí)行環(huán)境中解析所有構(gòu)建控制文件匾委,LOCAL_xxx變量是全局的,所以描述每個模塊之前氓润,聲明此變量赂乐,可以清除所有了LOCAL_xxx,這樣清理后避免相互影響咖气;
- LOCAL_MODULE:= xxxx
此變量聲明模塊名稱挨措,名稱必須唯一且不含任何空格;
Build System在生成最終共享庫文件時崩溪,會將"lib"作為前綴+模塊名稱+".so"作為共享庫文件名稱浅役;
比如:LOCAL_MODULE := ffmpegPlayer
模塊名稱為ffmpeg-decoder生成共享庫為libffmpegPlayer.so;
- LOCAL_SRC_FILES
此變量必須包含要構(gòu)建到模塊中的C/C++源文件列表伶唯,不需要列出頭文件和包含文件觉既,系統(tǒng)會自動導(dǎo)入依賴;
LOCAL_SRC_FILES :=FFmpegDecoder.cpp FFmpegConfigure.cpp
也可以這么寫
LOCAL_SRC_FILES:= \
LOCAL_SRC_FILES +=(LOCAL_PATH)/*.cpp)
- LOCAL_C_INCLUDES
變量設(shè)置頭文件的include目錄列表乳幸;
LOCAL_C_INCLUDES += $(LOCAL_PATH)/include
- LOCAL_LDLIBS
此變量包含構(gòu)建共享庫或可執(zhí)行文件時鏈接庫瞪讼,使用-l前綴傳遞特定系統(tǒng)庫的名稱,多個鏈接庫之間使用空格作為分隔符粹断;
變量列表:
-llog(日志庫):導(dǎo)入log.h頭文件
-lz(ZLib壓縮庫):添加zlib.h和zconf.h頭文件符欠;
-ldl(動態(tài)鏈接器庫):添加dlfcn.h頭文件,可以訪問Android動態(tài)鏈接器的dlopen()姿染、dlsym()和dlclose()函數(shù)背亥;
-lGLESv3(OpenGL ES3.1庫):此變量API 21開始秒际,添加gl31.h和gl3ext.h頭文件,提供了渲染機制狡汉,參考EGL原生平臺接口娄徊;從API 9開始提供EGL API,可以使用GLSurfaceView;
-ljnigraphics:允許C/C++以可靠方式訪問Java位圖對象的像素緩沖區(qū),導(dǎo)入bitmap.h頭文件盾戴,jnigraphics工作流程參考:NDK API中的jnigraphics;
-lOpenMAXAL(多媒體庫):導(dǎo)入OMXAL/OpenMAXAL.h和OMXAL/OpenMAXAL_Platform.h頭文件寄锐,提供原生多媒體處理庫;
-landroid(android原生頭文件庫): 原生頭文件列表包括native_activity.h尖啡、looper.h橄仆、input.h、keycodes.h等等衅斩,如需了解頭文件詳情參考:NDK API參考文檔盆顾;
例子:LOCAL_LDLIBS := -llog -lz
7.include $(BUILD_SHARED_LIBRARY)
include $(BUILD_STATIC_LIBRARY)表示編譯成靜態(tài)庫
include $(BUILD_SHARED_LIBRARY)表示編譯成動態(tài)庫。
include $(BUILD_EXECUTABLE)表示編譯成可執(zhí)行程序
include $(BUILD_PREBUILT)表示把文件當成編譯項目
一般我們作為外部引用庫都會生成動態(tài)庫.so文件畏梆,所以一般都會用BUILD_SHARED_LIBRARY