Android.mk语法规则(主要针对C编译)
参考页面:https://www.jb51.net/program/29533325i.htm
https://www.cnblogs.com/kn-zheng/p/17005182.html
Android.mk是什么
Android.mk是 Android 工程管理文件,类似于编译文件的说明书,用来向NDK编译系统描述源代码,并将源文件分组为模块(包括静态库、共享库、独立可执行文件)。
Android.mk 会被编译系统解析一次或多次,可以在每一个 Android.mk 文件中定义一个或多个模块,也可以多个模块使用同一个 .mk 文件。
尽量少的在Android.mk中声明变量,不要假定任何变量名不会在解析过程中定义,如若必须声明,变量名前最好加上特殊字符如MY_xxx
。
一个简单的Android.mk示例
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE:=test
LOCAL_C_ALL_FILES := $(call all-c-files-under)
LOCAL_MODULE_PATH:=$(LOCAL_PATH)/bin
LOCAL_SRC_FILES := test.c\
test1.c\
src/test3.c\
TARGET_PLATFORM := E3 # 指定平台
include $(BUILD_EXEUTABLE) # 指定编译产物类型
- my-dir是系统提供的宏函数,会返回最后一次include调用的makefile所在的路径,通常对应当前anroid.mk文件的目录
- CLEAR_VARS是另一个宏函数,它的作用是把编译相关的环境变量全部清空(防止之前的编译对当前编译过程产生影响),但不清空LOCAL_PATH
- 必须要先设置LOCAL_PATH然后在进行其他include操作
- LOCAL_MODULE指定了编译生成产物的名字,编译系统会自动产生合适的前缀和后缀
- LOCAL_MODULE_PATH指定了编译生成产物的所在位置
- LOCAL_SRC_FILES 指定了编译源代码
可以手动添加,也可以调用$(call all-c-files-under, src)
命令调用某个目录下的全部c文件 - 最后一行指定了编译所生成的目标文件格式,
BUILD_EXEUTABLE
对应了生成可执行Native程序
BUILD_SHARED_LIBRARY
对应了生成动态库(.so文件)
PREBUILT_SHARED_LIBRARY
对应了生成独立的动态库(.so文件)
BUILD_STATIC_LIBRARY
对应了生成静态库(.a文件)
PREBUILT_STATIC_LIBRARY
对应了生成独立的静态库(.so文件)
BUILD_PACKAGE
对应了生成apk文件
拓展情况
1. 编译源码需包含系统库(系统的.so文件)
eg: #include<utils/Log.h>
此时对应的Android.mk应添加:
LOCAL_SHARED_LIBRARIES += liblog
那么系统就会从缓存空间中寻找对应的liblog.so
2. 编译源码需包含第三方的库文件(第三方的.so文件)
Android.mk中应添加:
LOCAL_LDFLAGS := -L/Path -lxxx
其中xxx为对应的第三方.so库的名字
3. 编译源码需包含第三方的头文件(第三方的.h文件)
Android.mk中应添加:
LOCAL_C_INCLUDES += $(LOCAL_PATH)/../includes
4. 编译源码需要包含第三方的静态库(第三方的.a文件)
Android.mk中应添加:
LOCAL_LDFLAGS := $(LOCAL_PATH)/XXX.a
Android.mk的基本语法
- 变量赋值:
XXX := XXX
; 变量添加值:XXX += XXX
- 读取变量内容:
$(变量名字)
- 调用函数并返回字符:
$(call xxx_func)
include
将其他makefile或编译规则包含到当前的makefile中- 判断语句
ifeq ($(VALUE), xxx)
xxx
else # 此分支可有可无
xxx
endif
- 注释符号与python一致,使用
#
注释
NDK提供的一些常用宏函数
通过类似: $(call function) 的方式来调用,它将返回文本化的信息
- my-dir : 返回最后一次include调用的makefile所在的路径
- this-makefile,parent-makefile: 返回当前makefile或者父节点makefile所在的路径
- all-subdir-makefiles,all-subdir-java-files,all-subdir-c-files:返回当前目录下所有的xxxfile
- all-c-files-under,all-java-files-under:返回某个目录下所有的xxxfile、