Android.mk 詳解

Android.mk是Android提供的一個makefile文件,可以將源文件分組為模塊。用來引用的頭文件目錄、需要編譯的.c/.cpp文件、jni源文件、指定編譯生成*.so共享庫文件或者*.a靜態(tài)庫文件,可以定義一個或多個模塊,也可以多個模塊中使用同一個源文件;

一、Android.mk文檔

  1. Android.mk的官方文檔https://developer.android.google.cn/ndk/guides/android_mk
  2. 在NDK中的文檔路徑
    ndk目錄下docs中的ANDROID-MK.html文檔,eg:android-ndk-r9d/docs/ANDROID-MK.html;

二、基礎知識:

  1. LOCAL_PATH := $(call my-dir)

每個Android.mk文件都以LOCAL_PATH開始,Build System提供的宏函數 my-dir,此變量返回包含的makefile的路徑;
CLEAR_VARS不會清楚LOCAL_PATH變量;

  1. include $(CLEAR_VARS):

CLEAR_VARS變量由Build System提供,并指向一個特定的GNU Makefile,可為你清除LOCAL_xxx變量,但不會清除LOCAL_PATH變量;
因系統在單一GNU Make執(zhí)行環(huán)境中解析所有構建控制文件,LOCAL_xxx變量是全局的,所以描述每個模塊之前,聲明此變量,可以清除所有了LOCAL_xxx,這樣清理后避免相互影響;

  1. LOCAL_MODULE:= xxxx

此變量聲明模塊名稱,名稱必須唯一且不含任何空格;
Build System在生成最終共享庫文件時,會將"lib"作為前綴+模塊名稱+".so"作為共享庫文件名稱;
比如:LOCAL_MODULE := ffmpegPlayer
模塊名稱為ffmpeg-decoder生成共享庫為libffmpegPlayer.so;

  1. LOCAL_SRC_FILES

此變量必須包含要構建到模塊中的C/C++源文件列表,不需要列出頭文件和包含文件,系統會自動導入依賴;
LOCAL_SRC_FILES :=FFmpegDecoder.cpp FFmpegConfigure.cpp
也可以這么寫
LOCAL_SRC_FILES:= \
LOCAL_SRC_FILES += (wildcard(LOCAL_PATH)/*.cpp)

  1. LOCAL_C_INCLUDES

變量設置頭文件的include目錄列表;
LOCAL_C_INCLUDES += $(LOCAL_PATH)/include

  1. LOCAL_LDLIBS

此變量包含構建共享庫或可執(zhí)行文件時鏈接庫,使用-l前綴傳遞特定系統庫的名稱,多個鏈接庫之間使用空格作為分隔符;
變量列表:
-llog(日志庫):導入log.h頭文件
-lz(ZLib壓縮庫):添加zlib.h和zconf.h頭文件;
-ldl(動態(tài)鏈接器庫):添加dlfcn.h頭文件,可以訪問Android動態(tài)鏈接器的dlopen()、dlsym()和dlclose()函數;
-lGLESv3(OpenGL ES3.1庫):此變量API 21開始,添加gl31.h和gl3ext.h頭文件,提供了渲染機制,參考EGL原生平臺接口;從API 9開始提供EGL API,可以使用GLSurfaceView;
-ljnigraphics:允許C/C++以可靠方式訪問Java位圖對象的像素緩沖區(qū),導入bitmap.h頭文件,jnigraphics工作流程參考:NDK API中的jnigraphics;
-lOpenMAXAL(多媒體庫):導入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

?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • Android游戲開發(fā)實踐(1)之NDK與JNI開發(fā)02 承接上篇Android游戲開發(fā)實踐(1)之NDK與JNI...
    AlphaGL閱讀 3,934評論 0 24
  • 概述 文件用來向編譯系統描述如何編譯你的源代碼。更確切地說,該文件其實就是一個小型的Makefile。由于該文件會...
    FANZY_d3fa閱讀 1,390評論 0 0
  • mean to add the formatted="false" attribute?.[ 46% 47325/...
    ProZoom閱讀 3,224評論 0 3
  • Android.mk文件用來告知NDK Build 系統關于Source的信息。 Android.mk將是GNU ...
    IT小魔女的故事閱讀 836評論 0 3
  • 貼一篇舊文 魚唇里擠出來半個泡泡,銜著泡泡的嘴微微翕動,眼睛像個亮晶晶的貼片,有點點驚訝。一口氣吐出了泡泡擺了擺身...
    孫鐵柱閱讀 334評論 0 0

友情鏈接更多精彩內容