实际上,ndk-build 直接调用了 make,因此大部分传给make的选项都可用于ndk-build。例如:
ndk-build V=1 显示编译过程中真正被执行的命令(类似 make V=1)
ndk-build -B 强制全部重新编译(类似 make -B)
第一种方法:在编写 $PROJECT/jni/Android.mk 的时候,包含其他 Android.mk(该文件及相应源码在其他地方)。
第二种方法:在 Application.mk 中定义 APP_BUILD_SCRIPT变量,使它指向一个 Android.mk。
从NDK r4开始,默认的做法就是把Application.mk放在 $PROJECT/jni/, 然后在工程目录(即$PROJECT),直接调用ndk-build。
如果把Application.mk放在其他地方,则调用 ndk-build 的时候,需用环境变量指定 Application.mk 的位置:
ndk-build NDK_APPLICATION_MK=/path/to/your/Application.mk
如果你定义了多个模块,常常在编译一个模块的时候,包含你的另外一个模块的头文件。例如,jni目录下有foo和bar两个模块:
$PROJECT/jni/foo/ Android.mk foo.h foo.c $PROJECT/jni/bar/ Android.mk bar.c其中bar.c使用了foo.h。因此需要在jni/bar/Android.mk文件中,增加到foo模块的路径,才能正确编译,但是下面的这种写法错误:
LOCAL_C_INCLUDES := ../foo/
这样写不起作用,因为编译的时候,当前目录是ndk-build命令调用时用户所在目录(不是jni/bar/Android.mk所在目录),所以上面这样写会找不到foo.h。
正确的写法应该是:
LOCAL_C_INCLUDES := $(LOCAL_PATH)/../foo
LOCAL_PATH 表示Android.mk文件所在的目录。
除了上面方法,还可利用 NDK_APP_PROJECT_PATH 变量(NDK_APP_PROJECT_PATH指向工程根目录,即 $PROJECT)
LOCAL_C_INCLUDES := $(NDK_APP_PROJECT_PATH)/jni/foo
大多数情况下使用 LOCAL_PATH(上面大写字母变量是Android.mk中定义的变量,不是shell环境变量)