2010-10-15 118 views
11

我有一个大的C/C++库,我需要使用它作为Android NDK项目的一部分。这个库需要能够智能地处理UTF8字符串(例如,转换为小写/大写)。android中的unicode支持ndk

该库具有条件编译来启动OS API以进行转换,但似乎没有任何适用于UTF8的Android API。 (mbstowcs等)

This thread说使用JNI方法来做到这一点(!),这是一个相当重的解决方案。

我在想构建ICU,但是因为它使用GNU Autotools我不确定我可以使它与NDK工具链一起工作。 :/

有没有其他人遇到过这个问题,并且使用JNI以外的其他方法?

编辑:我试图让ICU编译失败在配置阶段:

checking wchar.h usability... no 
checking wchar.h presence... yes 
configure: WARNING: wchar.h: present but cannot be compiled 
configure: WARNING: wchar.h:  check for missing prerequisite headers? 
configure: WARNING: wchar.h: see the Autoconf documentation 
configure: WARNING: wchar.h:  section "Present But Cannot Be Compiled" 
configure: WARNING: wchar.h: proceeding with the preprocessor's result 
configure: WARNING: wchar.h: in the future, the compiler will take precedence 
checking for wchar.h... yes 
checking for library containing wcscpy... none required 
checking size of wchar_t... 0 
configure: error: There is wchar.h but the size of wchar_t is 0 
+0

你有没有得到这个工作? – tofutim 2012-02-09 17:54:00

+0

@ tofutim不,但我还没有能够重新访问它。 – paleozogt 2012-02-13 16:10:22

+0

正好碰到这个问题。 – tofutim 2012-03-19 22:42:32

回答

10

我们在NDK使用ICU。按照ICU交叉建筑说明中的步骤进行操作即可。基本上,你将拥有一个ICU本机目录(例如Windows或Linux),一个ICU Cygwin(如果使用这样的)和另一个ICU Android(ARM)。听起来很疯狂,但它起作用!

下面是在Cygwin下建立的步骤。我正在使用'CrystaX'NDK r4,但它也应该使用开箱即用的NDK来构建。 ICU版本4.4,但也适用于以前的版本。

  1. 补丁:

  2. 构建您的宿主版本的ICU(例如, Windows)按照正常。 (我们称这个$ HOST_ICU)

  3. 构建Cygwin的ICU:

    • 创建一个ICU-cygwin目录(我们称这个$ ICU_CROSS_BUILD)
    • 从ICU-cygwin的目录,运行“ $ HOST_ICU /源/ runConfigureICU Cygwin的
    • 使
  4. 建立ICU的NDK版本:

    • 创建一个icu-android目录
    • 从icu-android dir:'$ HOST_ICU/source/configure'使用适当的命令行选项。 --with-cross-build = $ ICU_CROSS_BUILD和--host = arm-eabi是必需的。
    • 使

我用这样的事情在过去(步骤#4)CPPFLAGS/CXXFLAGS/CFLAGS:

-I$NDK_ROOT/build/platforms/android-8/arch-arm/usr/include/ -O3 -fno-short-wchar -DU_USING_ICU_NAMESPACE=0 -DU_GNUC_UTF16_STRING=0 -fno-short-enums -nostdlib 

而对于LDFLAGS:

-lc -Wl,-rpath-link=$NDK_ROOT/build/platforms/android-8/arch-arm/usr/lib/ -L$NDK_ROOT/build/platforms/android-8/arch-arm/usr/lib/ 

和其他配置参数:

--enable-extras=no --enable-strict=no --enable-static --enable-shared=no --enable-tests=no --enable-samples=no --enable-dyload=no --enable-tools=no --host=arm-eabi --with-data-packaging=archive 

我还没有手动完成一段时间,它目前都在基于自定义Python的构建脚本中。如果遇到其他麻烦,我可以告诉你问题是什么。

祝你好运!

+0

我编辑了这个问题,以显示当我尝试使用NDK构建ICU时会发生什么 – paleozogt 2010-10-17 14:16:45

+0

有趣的修补程序,你应该考虑提交他们的门票来贡献他们 – 2010-10-20 05:02:01

+0

我当然会这样做。我真正的希望是Android开发者决定只展示一个完整的预装ICU,因为它已经在设备上使用过了 – NuSkooler 2010-10-21 01:38:39