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

  1. LOCAL_MODULE_FILENAME
    模块只设置LOCAL_MODULE而不设置LOCAL_MODULE_FILENAME,就会以“lib”前缀+module名称+“.so”命名生成的动态库名称,如果我们需要自己设置生成动态库名称就可以通过LOCAL_MODULE_FILENAME进行设置;
  2. 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++异常;
  3. LOCAL_C_INCLUDES
    此变量指定相对于NDK root目录的路径列表,在编译所有源文件(C、C++和Assembly)时添加到include搜索路径;
  4. LOCAL_ARM_MODE
    此变量指定生成ARM目标二进制文件;
  5. LOCAL_ARM_NEON
    此变量设置支持NEON,
    eg: LOCAL_ARM_NEON := true
  6. LOCAL_THIN_ARCHIVE
    此变量设置为true,构建静态库时生成一个只包含实际对象的文件路径而不包含对象的库,好处是库文件变小了,但是不能进行移植,因为所有的路径是相对路径.

Android.mk用法详解相关推荐

  1. Android.mk语法详解

    前言 目前 Android 工程可以通过 .mk.或者 .cmake 的形式构建 NDK 工程,较新的 Android 工程一般采用的是 .cmake 构建 NDK 源码,而相对创建时间久的工程则大多 ...

  2. Android.mk文件详解介绍

    Android.mk 编译文件是用来向 Android NDK描述你的 C,C++源代码文件的,   这篇文档描述了它的语法.在阅读下面的内容之前,假定你已经阅读了 docs/OVERVIEW.TXT ...

  3. android编译系统Android.mk使用详解

    2019独角兽企业重金招聘Python工程师标准>>> (1)Android.mk文件首先需要指定LOCAL_PATH变量,用于查找源文件.由于一般情况下 Android.mk和需要 ...

  4. Application.mk用法详解

    Application.mk文件定义要编译的多个变量的GNU Makefile片段,位于PROJECT/jni/目录下,PROJECT/jni/目录下,PROJECT/jni/目录下,PROJECT是 ...

  5. android常用头文件,Android.mk 使用详解

    和你一起终身学习,这里是程序员Android 经典好文推荐,通过阅读本文,您将收获以下知识点:一.Android.mk 简介二.Android.mk 的基本格式三.Android.mk 深入学习一四. ...

  6. android 剪贴板服务,Android剪贴板用法详解

    本文实例详述了Android剪贴板的用法,分享给大家供大家参考.具体方法分析如下: 这里首先需要注意的一点,就是在使用Android剪贴板的时候大家只记住一点就行了,不管是安卓设备还是PC机,复制粘贴 ...

  7. php android 复制粘贴板,Android_Android剪贴板用法详解,本文实例详述了Android剪贴板的 - phpStudy...

    Android剪贴板用法详解 本文实例详述了Android剪贴板的用法,分享给大家供大家参考.具体方法分析如下: 这里首先需要注意的一点,就是在使用Android剪贴板的时候大家只记住一点就行了,不管 ...

  8. android搜索功能xml,Android_Android ActionBar搜索功能用法详解,本文实例讲述了Android ActionBar - phpStudy...

    Android ActionBar搜索功能用法详解 本文实例讲述了Android ActionBar搜索功能用法.分享给大家供大家参考,具体如下: 使用ActionBar SearchView时的注意 ...

  9. android butterknife 自定义view,ButterKnife用法详解.md

    # ButterKnife用法详解 ### 如何成为T型人才,垂直在一个行业中,必须要有一整套[知识体系](https://github.com/WeiSmart/Android-Advanced-C ...

最新文章

  1. web.py做图片上传网页
  2. 准确率不变 损失率下降_最新斯诺克排名奥沙利文排在第二,丁俊晖排第十,第一保持不变...
  3. 机器学习中Python常用库总结(numpy,scipy,matplotlib,pandas)
  4. C++中OpenCV应用
  5. 一起谈.NET技术,Visual Studio自定义调试窗体两个小技巧
  6. mac搭建PHP开发环境
  7. a标签传值到另一个页面_vue-router页面传值及接收值
  8. linux查看气质系统文件命令,Linux dumpe2fs命令:查看文件系统信息
  9. Mac局域网本地库server, CornerStone使用
  10. mac 回车键、空格键失灵(非物理原因)解决方法
  11. Push to branch was rejected
  12. python中的 zip函数详解
  13. c语言组播源码_CLAA Class C简单组播业务的实现
  14. 520 miix 小兵 黑苹果_根据【黑果小兵】整理的黑苹果教程-小白教程
  15. Android面试题(25)-Bundle机制
  16. 直流通路下共射、共集、共基放大电路分析
  17. CF855B Marvolo Gaunt‘s Ring题解
  18. RS485利用地址主动仲裁驱动
  19. idea svn回退版本_版本控制 -- idea 整合 SVN
  20. 再见SpringMVC!字节跳动正式启动2021届秋季校招!不可思议!

热门文章

  1. JEECG Framework 3.3.1 beta版本发布第一天战报(文档下载量破1300、...
  2. 9路棋盘java代码_Java ServiceContext类代码示例
  3. 沉浸式全息本是什么_“全息投影”走进健身房,打造沉浸式健身体验室,想来试试吗?...
  4. php 根据输入值读取MySQL_MySQL输入PHP给出的另一个值
  5. Yet Another Broken Keyboard
  6. inlfuxdb版本_InfluxDB和MySQL的读写对比测试
  7. 传奇服务器能否修改合击技能,传奇合击私服(合击技能)站站职业如何释放的更加准确与强大?...
  8. linux脚本变量运算符,linux——Shell 脚本基础篇(变量类型,变量操作,定义,运算与逻辑关系)...
  9. android后台自播放音乐,Android实现后台播放音乐(Service方式)
  10. ee2prom擦除 c语言,浮点数在E2PROM中的存取方法.doc