11

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

该库具有条件编译,可以将其添加到 OS API 进行转换,但似乎没有任何适用于 UTF8 的 Android API。(mbstowcs等)

该线程说要使用 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
4

1 回答 1

11

我们在 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/source/runConfigureICU Cygwin'
    • 制作
  4. 搭建 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 的自定义构建脚本中。如果您遇到任何其他麻烦,我可能会告诉您问题所在。

祝你好运!

于 2010-10-16T02:13:44.700 回答