ndk-build 命令用法
实际上,ndk-build 直接调用了 make,因此大部分传给make的选项都可用于ndk-build。例如:
ndk-build V=1 显示编译过程中真正被执行的命令(类似 make V=1)
ndk-build -B 强制全部重新编译(类似 make -B)
如何把源文件放在 $PROJECT/jni/ 以外的地方
第一种方法:在编写 $PROJECT/jni/Android.mk 的时候,包含其他 Android.mk(该文件及相应源码在其他地方)。
第二种方法:在 Application.mk 中定义 APP_BUILD_SCRIPT变量,使它指向一个 Android.mk。
如何把 Application.mk 放在 $PROJECT/jni/ 以外的地方:
从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环境变量)