android.mk

 Android.mk是Android提供的一个makefile文件,可以将源文件分组为模块。用来引用的头文件目录、需要编译的*.c/*.cpp文件、jni源文件、指定编译生成*.so共享库文件或者*.a静态库文件,可以定义一个或多个模块,也可以多个模块中使用同一个源文件;

       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变量;

     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 += $(LOCAL_PATH)/include

       6. LOCAL_LDLIBS

         此变量包含构建共享库或可执行文件时链接库,使用-l前缀传递特定系统库的名称,多个链接库之间使用空格作为分隔符;

   NDK为Android版本提供新的头文件和库,文件路径:$NDK/platforms/android-<level>/<abi>/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参考文档;

      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中的变量设置相似;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值