android ndk中的unicode支持

android ndk中的unicode支持,android,unicode,utf-8,android-ndk,icu,Android,Unicode,Utf 8,Android Ndk,Icu,我有一个很大的C/C++库,我需要将它作为Android NDK项目的一部分使用。该库需要能够智能地处理UTF8字符串(例如,转换为小写/大写) 该库具有条件编译功能,可将其转换为操作系统API,但似乎没有任何适用于UTF8的Android API。(MBCS等) 说使用JNI方法来做(!),这是一个相当重的解决方案 我曾考虑过构建,但由于它使用GNU自动工具,我不确定是否可以使用NDK工具链来实现它/ 除了使用JNI,还有其他人遇到过这个问题并做过其他事情吗 编辑:我试图让ICU编译的尝试在配

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

该库具有条件编译功能,可将其转换为操作系统API,但似乎没有任何适用于UTF8的Android API。(MBCS等)

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

我曾考虑过构建,但由于它使用GNU自动工具,我不确定是否可以使用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

我们在NDK使用ICU。按照ICU跨大楼说明中的步骤进行操作,您会没事的。基本上,您将拥有一个ICU本机目录(例如Windows或Linux)、一个ICU Cygwin(如果使用这样的目录),还有一个ICU Android(ARM)。听起来很疯狂,但是很管用

以下是在Cygwin下构建的步骤。我使用的是“CrystaX”NDKR4,但它也应该使用现成的NDK。ICU版本4.4,但也适用于以前的版本

  • 补丁:

    • 源/配置()
    • source/Makefile.in()
    • source/config/(将mh linux复制到mh未知)
    • source/tools/pkgdata/pkgdata.cpp()
  • 按照正常方式构建您的ICU主机版本(如Windows)。(我们称之为$HOST_ICU)

  • 建造Cygwin ICU:

    • 创建一个icu cygwin目录(我们称之为$icu\u交叉构建)
    • 从icu cygwin目录运行“$HOST\u icu/source/runConfigureICU cygwin”
    • 制造
  • 构建ICU的NDK版本:

    • 创建一个android目录
    • 来自icu android目录:“$HOST_icu/source/configure”,带有适当的命令行选项--交叉构建=需要$ICU\u交叉构建和--host=arm eabi
    • 制造
  • 对于传入的(步骤4)CPPFLAGS/cxflags/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的构建脚本中。如果你遇到任何其他麻烦,我可能会告诉你问题是什么


    祝你好运

    我编辑了这个问题,以展示当我尝试用NDK构建ICU时会发生什么。有趣的补丁,你应该考虑向他们提交一份申请单,我当然会。我真正的希望是Android开发者决定只公开一个完整的预装ICU,因为它已经在设备上使用了。目前还没有更新,但即使在NDK或ICU的较新版本上,它仍然可以工作。我一直在拖延向ICU提交任何东西,因为他们已经改变了他们的构建系统,使类似的事情变得更容易。在不久的将来,我计划将一些项目升级到最新的ICU,并尝试实现一些更干净的东西并提交。@tofutim最终提交了这个补丁。在52号重症监护室。你有没有让它工作过?@tofutim没有,但我也没能重温它。正好遇到这个问题。添加了ICU标签。完全忽略了这个问题。在OSX上编译android的49.1.2版本中,我又遇到了同样的问题(