转载请注明出处为KlayGE游戏引擎,本文的永久链接为http://www.klayge.org/?p=1672

随着Android 4.0的发布,NDK也更新到了r7。不用白不用,我就下了一个试试。在初探的过程中,发现一些令人惊喜的地方。

惊喜1:不再需要Cygwin才能编译

这个惊喜其实在release note里就有提到,标记为Experimental features。

NDK r7提供了ndk-build.cmd和make等,可以直接在Windows上调用ndk-build了,不再需要Cygwin。但是ndk-gdb仍然必须有Cygwin才能debug。

惊喜2:wstring的支持

没有任何地方提到这一点,而且是默认关闭的。

原先的NDK在android-9下是支持wchar_t的,但是不支持wstring、wstringstream等。当需要用到那些的时候,就得用第三方定制的NDK,比如CrystaX NDK r6。但CyrstaX更新速度较慢,还没有对应于r7的版本。我尝试用NDK r7来编译boost的时候,filesystem v3通不过,因为它要求wstring的支持。但在r7的stl里确实看到了wstring的定义,包在了#ifdef _GLIBCXX_USE_WCHAR_T/#endif之间。所以我在编译命令行中添加了_GLIBCXX_USE_WCHAR_T这个宏,于是filesystem v3也可以顺利编译了!看来以后也不需要第三方NDK了。

EDIT:进一步测试发现虽然编译能通过,但在link的时候还是出错了。所以r7仍然没有完整的wstring支持。

惊喜3:发现一个bug

准确地说这只是惊,喜的是找到了workaround。

在用NDK r7编译glloader的时候,出现了找不到libgnustl_static.a的错误(只有在Windows下用ndk-build.cmd的时候会出现这个问题)。在google group上找到的一个解决方法是手动把libgnustl_static.a从%ANDOIRD_NDK%\sources\cxx-stl\gnu-libstdc++\libs\armeabi拷到obj\local\armeabi下(如果还需要编译armeabi-v7a和x86的话,也得拷到对应的目录)。如此这般之后,问题解决,glloader也可以顺利地用r7编译出libglloader.so了。希望这个bug能在以后的NDK中解决。

以上是我在试用NDK r7的时候发现的一些东西,以后用多了可能还会发现更多惊喜。