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中把‘foo’module的路径添加进来。
可以使用下面的设置:
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)会更好一些。