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的基本语法

  1. 变量赋值: XXX := XXX; 变量添加值: XXX += XXX
  2. 读取变量内容: $(变量名字)
  3. 调用函数并返回字符: $(call xxx_func)
  4. include 将其他makefile或编译规则包含到当前的makefile中
  5. 判断语句
ifeq ($(VALUE), xxx)
xxx
else # 此分支可有可无
xxx
endif
  1. 注释符号与python一致,使用#注释

NDK提供的一些常用宏函数

通过类似: $(call function) 的方式来调用,它将返回文本化的信息

  1. my-dir : 返回最后一次include调用的makefile所在的路径
  2. this-makefile,parent-makefile: 返回当前makefile或者父节点makefile所在的路径
  3. all-subdir-makefiles,all-subdir-java-files,all-subdir-c-files:返回当前目录下所有的xxxfile
  4. all-c-files-under,all-java-files-under:返回某个目录下所有的xxxfile、
posted @ 2024-07-28 18:57  yinpengchen  阅读(17)  评论(0编辑  收藏  举报