日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android.mk用法详解

發布時間:2023/12/15 Android 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android.mk用法详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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

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;
  • 基礎知識:
    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使NDKAndroidNDK/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_FILENAME
    模塊只設置LOCAL_MODULE而不設置LOCAL_MODULE_FILENAME,就會以“lib”前綴+module名稱+“.so”命名生成的動態庫名稱,如果我們需要自己設置生成動態庫名稱就可以通過LOCAL_MODULE_FILENAME進行設置;
  • LOCAL_CPP_EXTENSION
    此變量設置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++異常;
  • LOCAL_C_INCLUDES
    此變量指定相對于NDK root目錄的路徑列表,在編譯所有源文件(C、C++和Assembly)時添加到include搜索路徑;
  • LOCAL_ARM_MODE
    此變量指定生成ARM目標二進制文件;
  • LOCAL_ARM_NEON
    此變量設置支持NEON,
    eg: LOCAL_ARM_NEON := true
  • LOCAL_THIN_ARCHIVE
    此變量設置為true,構建靜態庫時生成一個只包含實際對象的文件路徑而不包含對象的庫,好處是庫文件變小了,但是不能進行移植,因為所有的路徑是相對路徑.
  • 總結

    以上是生活随笔為你收集整理的Android.mk用法详解的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。