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

该库具有条件编译功能,可转换为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

最佳答案

我们正在NDK中使用ICU。请按照ICU交叉构建说明中的步骤进行操作,您会没事的。基本上,您将拥有一个ICU native 目录(例如Windows或Linux),一个ICU Cygwin(如果使用的话)和另一个用于ICU Android(ARM)的目录。听起来很疯狂,但是有效!

以下是在Cygwin下进行构建的步骤。我正在使用“CrystaX” NDK r4,但它也应该与现成的NDK一起构建。 ICU版本4.4,但也可以与以前的版本一起使用。

  • 补丁:
  • 源/配置(http://pastebin.com/kDEbYdMe)
  • 源/Makefile.in(http://pastebin.com/785Lnsb5)
  • 源/配置/(将mh-linux复制到mh-未知)
  • 源/工具/pkgdata/pkgdata.cpp(http://pastebin.com/ZiRexjkp)
  • 按照常规方式构建您的ICU主机版本(例如Windows)。 (我们将其称为$ HOST_ICU)
  • 构建Cygwin ICU:
  • 创建一个icu-cygwin目录(我们将其称为$ ICU_CROSS_BUILD)
  • 从icu-cygwin目录中,运行'$ HOST_ICU/source/runConfigureICU Cygwin'
  • 使
  • 生成ICU的NDK版本:
  • 创建一个icu-android目录
  • 来自icu-android目录:'$ 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的自定义构建脚本中。如果您遇到任何其他麻烦,我可能可以告诉您问题所在。

    祝你好运!

    10-06 13:21
    查看更多