一、简介
Android.mk 是一种脚本语言,是将 C/C++ 源文件粘合至 NDK 的构建文件。
官网对Android.mk的介绍如下:
假设一个算法的根目录名字叫eptz 其目录结构如下:
eptz.
|
├── build (android编译的mk文件配置,此文档主要讲解Android.mk配置)
│ ├── android
│ └── Android.mk
├── camxchinodeeptz.cpp (eptz算法的.cpp文件,主要是通过高通memcpy算法更改过来的,也是我们主要实现的功能)
├── camxchinodeeptz.h (eptz算法的.h文件,主要是通过高通memcpy算法更改过来的,也是我们主要实现的功能)
├── TS_HeadDetector (eptz算法所需要引入的三方算法库的库名字)
│ ├── inc
│ │ └── TCHeadDetector_VC.hZ (三方算法库的头文件)
│ ├── lib
│ ├── v7 (三方算法库32 提供的so)
│ │ ├── libc++_shared.so
│ │ ├── libtc_headdetector.so
│ │ └── libtensorflowlite_gpu.so
│ └── v8 (三方算法库64 提供的so)
│ ├── libc++_shared.so
│ ├── libtc_headdetector.so
│ └── libtensorflowlite_gpu.so
├── TS_LDC (第二个三方算法库)
└── C626
└── tsldc
├── inc
│ ├── tsldcdefine.h
│ └── tsldc.h
├── lib
│ └── libtsldc.so
├── lib64
│ └── libtsldc.so
├── tsldc4k.bin
└── tsldc720p.bin
二、一些超级基本的语法
# 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)
三、常用变量名
1. LOCAL_PATH := $(call my-dir)
每个Android.mk文件必须以定义LOCAL_PATH为开始。它用于在开发tree中查找源文件。系统提供的宏函数my-dir返回包含Android.mk所在的目录路径。它不会被 CLEAR_VARS 清除,写法也很固定,即:LOCAL_PATH := $(call my-dir)
2.include $(CLEAR_VARS)
CLEAR_VARS 变量由系统提供并指向一个指定的GNU Makefile,由它负责清理很多LOCAL_xxx.
例如:LOCAL_MODULE, LOCAL_SRC_FILES, LOCAL_STATIC_LIBRARIES等等。但不清理LOCAL_PATH. 这个清理动作是必须的,因为所有的编译控制文件由同一个GNU Make解析和执行,其变量是全局的。所以清理后才能避免相互影响。
3.LOCAL_MODULE := hello-jni
LOCAL_MODULE模块必须定义,以表示Android.mk中的每一个模块。名字必须唯一且不包含空格。Build System会自动添加适当的前缀和后缀。例如,foo,要产生动态库,则生成libfoo.so.
但请注意:如果模块名被定为:libfoo.则生成libfoo.so. 不再加前缀。
4.LOCAL_MODULE_CLASS
<