随着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的时候发现的一些东西,以后用多了可能还会发现更多惊喜。
Comments