一、简介

Android.mk 是一种脚本语言,是将 C/C++ 源文件粘合至 NDK 的构建文件。
官网对 Android.mk 的介绍:https://developer.android.com/ndk/guides/android_mk

二、一些超级基本的语法

例如我们使用 # 表示注释,使用 $() 表示取值,使用 := 表示赋值,使用 += 表示附加等等。
在学习之前,我们起码得看得懂这些。

示例:

# 注释内容使用 "#" 号# call 是调用一个系统提供的宏函数,此处是 my-dir
# $() 是取值
# := 是赋值
LOCAL_PATH := $(call my-dir)# 我们也可以使用 ifeq 和 ifneq 进行条件判断
ifeq ($(HOST_OS, linux)...(省略)
else...(省略)
endif# 使用 := 是赋值,当某一行很长时,可以使用反斜杠 \ 换行
LOCAL_SRC_FILES := adb.c \utils.c# 使用 += 是附加
LOCAL_SRC_FILES += $(USB_SRCS)

三、常用变量名

变量名 说明
LOCAL_PATH 用来指定当前源码所在的目录,它不会被 CLEAR_VARS 清除,一般第一步就是定义该变量,写法也很固定,即:
LOCAL_PATH := $(call my-dir)
CLEAR_VARS 清除很多除 LOCAL_PATH 外的变量。因为所有的 Makefile 都是在同一个编译环境在执行的,变量的定义理论上都是全局的,所以每个模块编译开始前进行清理工作是非常必要的。写法也很固定,即:
include $(CLEAR_VARS)
LOCAL_MODULE 模块名,整个编译系统中唯一存在,命名时中间不能有空格,且系统会帮你添加诸如 “lib” 前缀和 “.a” 或 “.so” 后缀等
LOCAL_MODULE_PATH 模块的输出路径
LOCAL_MODULE_TAGS 模块的一些标签,标签之间使用空格隔开
LOCAL_SRC_FILES 此变量包含构建系统用于生成模块的源文件列表,可使用相对路径或绝对路径,但为了移植性应尽量选择使用相对路径
LOCAL_CC 指定 C 编译器
LOCAL_CXX 指定 C++ 编译器
LOCAL_CPP_EXTENSION 可以使用此可选变量为 C++ 源文件指明 .cpp 以外的文件扩展名,如:
LOCAL_CPP_EXTENSION := .cxx .cpp .cc
LOCAL_CFLAGS 此可选变量为构建系统设置在构建 C 和 C++ 源文件时要传递的编译器标志。
此功能对于指定额外的宏定义或编译选项可能很有用
LOCAL_CPPFLAGS(LOCAL_CXXFLAGS) 仅当构建 C++ 源文件时才会传递一组可选的编译器标志。
它们将出现在编译器命令行中的 LOCAL_CFLAGS 后面
LOCAL_C_INCLUDES 编译所需的额外头文件,可以使用此可选变量指定相对于 NDK root 目录的路径列表
LOCAL_STATIC_LIBRARIES 编译所需的静态库列表
LOCAL_SHARED_LIBRARIES 编译所需的动态库列表
LOCAL_JAVA_LIBRARIES 编译所需的 Java 类库
LOCAL_LDLIBS 编译所需的其他链接器标志列表。它可让您使用 -l 前缀传递特定系统库的名称。
例如,以下示例指示链接器生成在加载时链接到 /system/lib/libz.so 的模块:
LOCAL_LDLIBS := -lz
LOCAL_LDFLAGS 构建共享库或可执行文件时供构建系统使用的其他链接器标志列表
BUILD_HOST_STATIC_LIBRARY
BUILD_HOST_SHARED_LIBRARY
BUILD_HOST_EXECUTABLE
BUILD_STATIC_LIBRARY
BUILD_SHARED_LIBRARY
BUILD_EXECUTABLE
BUILD_RAW_STATIC_LIBRARY
BUILD_RAW_EXECUTABLE
各种形式的编译模板,生成指定形式的文件

示例

LOCAL_PATH := $(call my-dir)
LOCAL_PREBUILT_DIR := prebuilt# 预编译模块1
include $(CLEAR_VARS)
LOCAL_MODULE := fastcv_android
LOCAL_SRC_FILES := $(LOCAL_PREBUILT_DIR)/lib/$(TARGET_ARCH_ABI)/libfastcv_android.a
include $(PREBUILT_STATIC_LIBRARY)# 预编译模块2
include $(CLEAR_VARS)
LOCAL_MODULE := api_fastcv
LOCAL_SRC_FILES := $(LOCAL_PREBUILT_DIR)/lib/$(TARGET_ARCH_ABI)/libapi_fastcv.a
include $(PREBUILT_STATIC_LIBRARY)# 预编译模块3
include $(CLEAR_VARS)
LOCAL_MODULE := fmath_android_armv7
LOCAL_SRC_FILES := $(LOCAL_PREBUILT_DIR)/lib/$(TARGET_ARCH_ABI)/libfmath_android.a
include $(PREBUILT_STATIC_LIBRARY)# 预编译模块4
include $(CLEAR_VARS)
LOCAL_MODULE := api_fmath
LOCAL_SRC_FILES := $(LOCAL_PREBUILT_DIR)/lib/$(TARGET_ARCH_ABI)/libapi_fmath.a
include $(PREBUILT_STATIC_LIBRARY)# 目标模块
include $(CLEAR_VARS)
LOCAL_MODULE := demo
# 源文件
LOCAL_SRC_FILES := hello.cpp \world.cpp \# 额外的头文件
LOCAL_C_INCLUDES += $(LOCAL_PATH) $(LOCAL_PATH)/$(LOCAL_PREBUILT_DIR)/include
# 需要链接的系统库
LOCAL_LDLIBS := -llog -lz -L$(SYSROOT)/usr/lib/$(TARGET_ARCH_ABI) -ljnigraphics
# 一些宏定义和编译选项
LOCAL_CFLAGS := -DFASTCV_USE_ARM -DUSE_ARM
LOCAL_CFLAGS += -std=c++11
# 链接上面预编译的静态库
LOCAL_STATIC_LIBRARIES := -L$(LOCAL_PATH)/lib api_fastcv fastcv_android fmath_android api_fmath
# 编译所需要动态库
LOCAL_SHARED_LIBRARIES := face_api
# 指定生成动态库
include $(BUILD_SHARED_LIBRARY)

注意到,一个模块总是以 include $(CLEAR_VARS) 开始,以 include $(BUILD_SHARED_LIBRARY) 结束(这里也可以是其它的编译模板,如 BUILD_STATIC_LIBRARY)。

四、NDK 提供的函数宏

使用 $(call <function>) 来调用函数。

下表介绍 NDK 提供的 GNU Make 函数宏。当然一些厂商源码也会提供一些定制化的函数。

函数 说明
my-dir 此宏返回最后包含的 makefile 的路径,通常是当前 Android.mk 的目录
all-subdir-makefiles 返回位于当前 my-dir 路径所有子目录中的 Android.mk 文件列表
this-makefile 返回当前 makefile(构建系统从中调用函数)的路径
parent-makefile 返回包含树中父 makefile 的路径(包含当前 makefile 的 makefile 路径)
grand-parent-makefile 返回包含树中祖父 makefile 的路径(包含当前父 makefile 的 makefile 路径)
import-module 用于按模块的名称查找和包含模块的 Android.mk 文件的函数。 典型的示例如下所示:
$(call import-module,<name>)

Android.mk 语法和变量介绍相关推荐

  1. android.mk官网介绍,转载:Android.mk语法介绍

    Android.mk内的变量定义 3.1 LOCAL_PATH 一个Android.mk file首先必须定义好LOCAL_PATH变量.它用于在开发树中查找源文件.例如: 1.LOCAL_PATH: ...

  2. android.mk多个module,Android.mk中的变量的使用介绍(二)

    废话不多说,直接分享,欢迎斧正. Android.mk中的变量(二) 1.LOCAL_PATH 这个变量用于给出当前文件的路径.你必须在Android.mk的开头定义.例如: LOCAL_PATH : ...

  3. Android.mk语法详解

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

  4. Android.mk语法解释

    大家在编写Android的Native代码时,经常会接触到一个叫做Android.mk的文件. 虽然编译的时候都用到的是make,但是这个Android.mk文件里的语法还跟一般的make文件语法不太 ...

  5. Android.mk文件详解介绍

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

  6. android.mk 语法

    Android编译系统的makefile文件Android.mk写法如下 (1)   Android.mk文件首先需要指定LOCAL_PATH变量,用于查找源文件.由于一般情况下 Android.mk ...

  7. Android.mk 文件语法详解

    0. Android.mk简介: Android.mk文件用来告知NDK Build 系统关于Source的信息. Android.mk将是GNU Makefile的一部分,且将被Build Syst ...

  8. Android.mk 打印变量信息

    编译android项目的时候,遇到了添加一个包含opencv的Opencv.mk之后,就存在编译不通过的情况. 怀疑是添加 include Opencv.mk 之后, 就把原来 Android.mk ...

  9. JNI开发之-Android.mk和Application.mk 详解

    Android.mk和Application.mk 详解 Android.mk 基础知识 变量和宏 NDK 定义的 include 变量 目标信息变量 模块描述变量 NDK 提供的函数宏 Applic ...

最新文章

  1. 盘点|最实用的机器学习算法优缺点分析,没有比这篇说得更好了
  2. vSphere利用NTP为主机同步时间
  3. 读书笔记-单元测试艺术(二)-单元测试框架
  4. Unity3D常见面试题
  5. linux查看指定用户的所有进程
  6. java输入正确的信息_判断用户输入的信息是否正确
  7. linux系统建立文件系统,linux文件系统的建立
  8. Android Studio配置Gradle(包括signingConfigs、buildTypes和productFlavors等)
  9. c语言:使用main函数的参数,实现一个整数计算器
  10. 51地图标注接口(EZMarker API)
  11. AutoIt-v3的安装,和robotframework-autoitlibrary的导入
  12. [iOS] 浅析排序规则描述类: NSSortDescriptor
  13. Spring MVC 双亲上下文的说明
  14. 华为云服务器使用教程
  15. PFSO-T5,一种OLED材料
  16. WiFI Display介绍
  17. vscode中setting.json配置详解
  18. ping通www.baidu.com的完整过程。
  19. 普源DG1022U信号发生器技术参数
  20. 【运维】- raid管理工具MegaCli以及storcli使用介绍

热门文章

  1. 天津市地图 天津电子地图下载
  2. ARIMA一阶差分和二阶差分还原
  3. RS485 MODBUS转PROFINET网关案例_汇川变频器接入到1500 PROFINET
  4. 扫描型PDF转成可搜索可复制的文字型PDF,使用PDF24 OCR 程序报“下载需要的文件时出现一个错误”
  5. MYSQL 开发设计表是硬邦邦的VARHCAR 还是JSON TYPE 来处理数据更香
  6. c语言课程设计-商场商品信息管理,C语言课程设计商场商品信息管理系统
  7. ADC分压电路引入的噪声
  8. 虚拟现实VR(视景仿真、系统仿真、可视化)工作站配置方案
  9. 第三篇——胡咧咧之动漫素材如何剪辑,只拼接可以吗?
  10. 红客联盟初步完成整顿 拟大举攻击日反华网