首先,Android.mk文件位于项目jni/目录中的子目录中。
1、第一行,必须先定义LOCAL_PATH变量。
LOCAL_PATH : = $(call my-dir)
表示源文件在开发树中的位置。my-dir将返回当前目录(Android.mk文件本身所在的目录)的路径。
2、第二行,申明CLEAR_VARS变量,其值由编译系统提供。
include $(CLEAR_VARS)
CLEAR_VARS变量会指向一个特殊的GNU Makefile,而GNU Makefile会清除许多的LOCAL_XXX的变量,但是,GNU Makefile不会清楚LOCAL_PATH。LOCAL_PATH会保留其值。因为系统在单一 GNU Make 执行环境(其中的所有变量都是全局变量)中解析所有编译控制文件。在描述每个模块之前,必须声明(重新声明)此变量。
3、第三行,排除文件
EXCLUDE_FILES := 文件目录路径
排除不需要的,不兼容的,测试的class文件等。
4、下一行,LOCAL_MODULE
变量存储要编译的模块的名称。要求在应用的每个模块中使用一次此变量。
LOCAL_MODULE := hello-jni
每个模块名称必须唯一,且不含任何空格。编译系统在生成最终共享库文件时,会对您分配给 LOCAL_MODULE
的名称自动添加正确的前缀和后缀。例如,上述示例会生成名为 libhello-jni.so
的库。
5、下一行,会列举源文件,以空格分隔多个文件
LOCAL_SRC_FILES := hello-jni.c
LOCAL_SRC_FILES
变量必须包含要编译到模块中的 C 和/或 C++ 源文件列表。
6、最后帮助系统将所有内容连接到一起
include $(BUILD_SHARED_LIBRARY)
BUILD_SHARED_LIBRARY
变量指向一个 GNU Makefile 脚本,该脚本会收集最近 include
以来在 LOCAL_XXX
变量中定义的所有信息。
此脚本确定要编译的内容以及编译方式。