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