Android NDK How-To:

-----------------------------

NDK用户收集的一些使用技巧

如何强制显示编译命令:

-------------------------------

执行“ndk-build V=1”会显示实际编译的命令。这个可以用来验证是否按你的期望进行编译,同时可以在NDK编译系统中检查bug

V= 1来自于Linux内核编译系统)

如何强制重新编译你所有的源代码:

----------------------------------------------

使用 GNU Make “-B” 选项,如下:

ndk-build –B

如何将你的本地代码放在$PROJECT/jni 之外的地方:

-----------------------------------------------------------------------------

当然,你可以在$PROJECT/jni/Android.mk 文件中包含放在其他地方的Android.mk文件。

另外一种办法是,你可以在Application.mk中定义 APP_BUILD_SCRIPT,让它指向一个Android.mk文件。

如何编译一个工程的本地文件,而不用cd到工程的目录中:

------------------------------------------------------------------------------

有时候,你需要重新编译本地文件,而又不想从命令行cd到工程的顶级目录中去。你可以使用GNU-Make -C <path>’选项,如:

ndk-build  –C <project-path>

如何将Application.mk文件放在$PROJECT/jni之外的地方:

----------------------------------------------------------------------------------------

NDK r4开始,你只要简单的将Application.mk文件放在$PROJECT/jni下,然后从你的目录树执行“ndk-build”脚本即可。

如果你想使用“ndk-build”,但是Application.mk放在其他地方,可以使用 GNU Make变量:

ndk-build NDK_APPLICATION_MK=/path/to/your/Application.mk

如果你使用之前版本遗留下来的$NDK/apps/<name> 编译方法,你可以创建一个符号链接,指向Application.mk最终所在位置,例如,假如你这样写:

$PROJECT/foo/Application.mk

你可以像这样创建一个符号链接:

ln –s$PROJECT/foo $NDK/apps/<name>

这会使得$NDK/apps/<name>/Application.mk直接指向$PROJECT/jni/Application.mk

注意生成的文件依然在$NDK/out/apps<name>中。

windows用户:只能在Cygwin上面使用符号链接“ln-s”命令:

   ln–s <target> <link>

如何正确的将你要包含的目录添加到你的module声明中:

----------------------------------------------------------------------------

如果你定义了很多modules,通常你在编译一个module的时候需要包含另一module的头文件。例如,考虑下面的例子:

$PROJECT/jni/foo/

 Android.mk

 foo.h

 foo.c

$PROJECT/jni/bar/

 Android.mk

 bar.c

在‘bar.c’中使用了‘#include <foo.h>’。你编译的时候,必须在jni/bar/Android.mk中把‘foomodule的路径添加进来。

可以使用下面的设置:

  LOCAL_C_INCLUDES  := ../foo

但是这样是不能工作的,因为所有的编译都是在调用‘ndk-build’的那个目录下进行的,并且所有的include文件也必须相对于这个目录。

正确的应该是:

  LOCAL_C_INCCLUDES  :=$(LOCAL_PATH)/../foo

使用了一个相对路径$(LOCAL_PATH),这样你就可以根据自己的需要将‘foo’和‘bar’移动到‘source’目录结构中更深层次的目录下了。

如果你要用绝对路径,你可以使用NDK_APP_PROJECT_PATH指向你的工程目录。

  LOCAL_C_INCLUDES := $(NDK_APP_PROJECT_PATH)/jni/foo

但是,我们不推荐使用这个,使用相当路径$(LOCAL_PATH)会更好一些。