先看源码中的Demo。我的ndk安装路径为:D:\android-ndk-r10\samples\hello-jni\jni\Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := hello-jni
LOCAL_SRC_FILES := hello-jni.c
include $(BUILD_SHARED_LIBRARY)
LOCAL_PATH := $(call my-dir)定义当前目录
这句先定义了一个变量LOCAL_PATH并对其进行赋值,":="表示赋值,"+="表示追加,
"$(call)"表示调用一个宏
"my-dir"是由构建系统提供,其作用是返回当前Android.mk的所在目录(目录:(NDK_ROOT)/b/core/definitions.mk里面定义)
整行的意思是定义一个名为"LOCAL_PATH"并为其赋值为当前Android.mk文件所在的路径(必须放在第一行)
include $(CLEAR_VARS)清理系统变量
-
"CLEAR_VARS"是由构建系统提供的一个变量,它指向了一个makefile文件,即(NDK_ROOT)/build/core/clear-vars.mk;
-
"$(CLEAR_VARS)"是对变量的使用,即获取变量值;
-
"include"表示包含另一个makefile文件;
-
整行代码的意思是包含一个系统的makefile文件进来,并执行。
"CLEAR_VARS"指向的makefile文件的作用是清理除"LOCAL_PATH"之外所有"LOCAL_"开头的变量,这个很有必要。构建系统在构建项目的时候,会将所有makefile文件加载在一起并自上而下执行的,其中自己定义的Android.mk只是整个构建过程的一个小模块,若不清理"LOCAL_"开头的变量,这些变量就会沿用前面模块保留的值,这将会导致在构建这个模块时出现不可预知的问题。
开头的变量通常就是系统定义的变量
LOCAL_MODULE := hello-jni定义so库的名称
整行代码的意思是告诉构建系统,此构建目录的名称为"hello-jni",构建系统会对最终产物的文件名称添加前缀和后缀。一般情况下,上面代码对应的生成库的文件名称是"libhello-jni.a"或"libhello-jni.so"
LOCAL_SRC_FILES := hello-jni.c指定源文件
"LOCAL_SRC_FILES"是系统定义的变量,用于指定构建目标所需要的源文件,可以指定多个
整行代码的意思是告诉构建系统,需要将哪些源文件加入到构建中。"LOCAL_SRC_FILES "可以指定多定多个文件,用空格或Tab隔开,如下:LOCAL_SRC_FILES := hello-jni.c hello1.c
或则用"\" 换行的方式表示:LOCAL_SRC_FILES := hello-jni.c \
hello1.c