用于向编译系统描述源文件和共享库。
一个简单的例子:
LOCAL_PATH := $(call my-dir)//my-dir返回当前目录路径
include $(CLEAR_VARS)//对这个文件的LOCAL_XXX初始化
LOCAL_MODULE := hello-jni//将生成一个libhello-jni.so的库
LOCAL_SRC_FILES := hello-jni.c//包含编译到模块中的 C 和/或 C++ 源文件列表
include $(BUILD_SHARED_LIBRARY)//确定要编译的内容以及编译方式
下面详细的描述Android.mk每个部分的组成。
第一部分:定义文件路径
Android.mk
文件必须先定义 LOCAL_PATH
变量,其中my-dir
将返回当前目录的路径。
第二部分:初始化模块
CLEAR_VARS,它是指向一个GUN Makefile文件,会清除一系列LOCAL_XXX的变量,可以理解为初始化。
ps:不会清除LOCAL_PATH。
第三部分:模块描述变量
列举一部分模块变量
- LOCAL_MOUDULE,存储编译的模块的名称,必须在应用的每个模块中使用一次这个变量,且模块的名称必须唯一,这个变量就是在编译生成最终共享库文件的时候,会自动添加正确的前后缀。无需添加
lib
前缀或者.so
或.a
文件扩展名。 - LOCAL_MODULE_FILENAME,能够替换编译系统为其生成的文件默认使用的名称。强制生成的自己设置的文件名,但是无法替换文件路径或文件扩展名。
- LOCAL_SRC_FILES,包含编译系统生成模块时所用的源文件列表。只需要列出编译系统实际传递到编译器的文件,编译系统会自动计算所有相关的依赖关系。可以使用相对(相对于
LOCAL_PATH
)和绝对文件路径,为了可确保移植性,推荐使用相对路径。务必在编译文件中使用Unix样式的正斜杠 (/)。编译系统无法正确处理Windows样式的反斜杠 (\)。 - LOCAL_CPP_EXTENSION,为C++源文件指明
.cpp
以外的文件扩展名。 - LOCAL_CPP_FEATURES,指明代码依赖于特定 C++ 功能。它会在编译过程中启用正确的编译器标记和链接器标记。对于预编译二进制文件,此变量还会声明二进制文件依赖于哪些功能,从而确保最终链接正常运行。使用此变量可让编译系统对每个模块使用适当的标记。
- LOCAL_C_INCLUDES,指定相对于NDK
root
目录的路径列表,以便在编译所有源文件(C、C++ 和 Assembly)时添加到 include搜索路径。 - LOCAL_CFLAGS,设置在编译C和C++源文件时编译系统要传递的编译器标记。详细:https://blog.csdn.net/u014135607/article/details/79980018
- LOCAL_CPPFLAGS,只编译 C++ 源文件时将传递的一组可选编译器标记。它们将出现在编译器命令行中的
LOCAL_CFLAGS
后面。使用LOCAL_CFLAGS
为 C 和 C++ 指定标记。 - LOCAL_STATIC_LIBRARIES,此变量用于存储当前模块依赖的静态库模块列表。如果当前模块是共享库或可执行文件,此变量将强制这些库链接到生成的二进制文件。如果当前模块是静态库,此变量只是指出依赖于当前模块的其他模块也会依赖于列出的库。
- LOCAL_SHARED_LIBRARIES,此变量会列出此模块在运行时依赖的共享库模块。此信息是链接时必需的信息,用于将相应的信息嵌入到生成的文件中。
- LOCAL_WHOLE_STATIC_LIBRARIES,此变量是
LOCAL_STATIC_LIBRARIES
的变体,表示链接器应将相关的库模块视为完整归档。多个静态库之间存在循环依赖关系时,此变量很有用。使用此变量编译共享库时,它将强制编译系统将静态库中的所有对象文件添加到最终二进制文件。但是,生成可执行文件时不会发生这种情况。 - LOCAL_LDLIBS,此变量列出了在编译共享库或可执行文件时使用的额外链接器标记。可使用
-l
前缀传递特定系统库的名称。 - LOCAL_LDFLAGS,此变量列出了编译系统在编译共享库或可执行文件时使用的其他链接器标记。
- LOCAL_ALLOW_UNDEFINED_SYMBOLS,默认情况下,如果编译系统在尝试编译共享库时遇到未定义的引用,将会抛出“未定义的符号”错误。此错误可帮助您捕获源代码中的错误。要停用此检查,请将此变量设置为
true
。 - LOCAL_ARM_MODE,默认情况下,编译系统会在 thumb 模式下生成 ARM 目标二进制文件,其中每条指令都是 16 位宽,并与
thumb/
目录中的 STL 库关联。 - LOCAL_ARM_NEON,此变量仅在以
armeabi-v7a
ABI 为目标时才有意义。它允许在 C 和 C++ 源代码中使用 ARM Advanced SIMD (NEON) 编译器内建函数,以及在 Assembly 文件中使用 NEON 指令。 - LOCAL_DISABLE_FORMAT_STRING_CHECKS,默认情况下,编译系统会在编译代码时保护格式字符串。这样的话,如果
printf
样式的函数中使用了非常量格式的字符串,就会强制引发编译器错误。此保护默认启用,但您也可通过将此变量的值设置为true
将其停用。 - LOCAL_EXPORT_CFLAGS,此变量用于记录一组 C/C++ 编译器标记。这些标记将添加到通过
LOCAL_STATIC_LIBRARIES
或LOCAL_SHARED_LIBRARIES
变量使用此模块的任何其他模块的LOCAL_CFLAGS
定义中。要执行局部编译,请改用LOCAL_CFLAGS
。 - LOCAL_EXPORT_CPPFLAGS,此变量与
LOCAL_EXPORT_CFLAGS
相同,但仅适用于 C++ 标记。 - LOCAL_EXPORT_C_INCLUDES,此变量与
LOCAL_EXPORT_CFLAGS
相同,但适用于 C include 路径。 - LOCAL_EXPORT_LDFLAGS,此变量与
LOCAL_EXPORT_CFLAGS
相同,但适用于链接器标记。 - LOCAL_EXPORT_LDLIBS,此变量与
LOCAL_EXPORT_CFLAGS
相同,告诉编译系统将特定系统库的名称传递给编译器。请在您指定的每个库名称前附加-l
。 - LOCAL_SHORT_COMMANDS,当模块有很多源文件和/或依赖的静态或共享库时,请将此变量设置为
true
。这样会强制编译系统将@
语法用于包含中间对象文件或链接库的归档。 - LOCAL_THIN_ARCHIVE,编译静态库时,请将此变量设置为
true
。这样会生成一个库文件,其中不含对象文件,而只包含它通常包含的实际对象的文件路径。 - LOCAL_FILTER_ASM,此变量定义为一个 shell 命令,供编译系统用于过滤根据您为
LOCAL_SRC_FILES
指定的文件提取或生成的汇编文件。 - LOCAL_MODULE_TAGS :=user / eng / tests / optional
user: 指该模块只在user版本下才编译
eng: 指该模块只在eng版本下才编译
tests: 指该模块只在tests版本下才编译
optional:指该模块在所有版本下都编译
第四部分:设置NDK编译系统
确定要编译的内容以及编译方式。
BUILD_STATIC_LIBRARY:编译为静态库。
BUILD_SHARED_LIBRARY :编译为动态库。
BUILD_EXECUTABLE:编译为Native C可执行程序。
NDK 提供的函数宏
介绍 NDK 提供的 GNU Make 函数宏。使用 $(call <function>)
可以对这些宏进行求值;它们将返回文本信息。
- 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
文件。eg. $(call import-module,<name>)