android ndk 中的 unicode 支持

Posted

技术标签:

【中文标题】android ndk 中的 unicode 支持【英文标题】:unicode support in android ndk 【发布时间】:2011-04-26 01:04:24 【问题描述】:

我有一个大型 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

【问题讨论】:

你有没有让这个工作? @tofutim 不,但我也无法重新访问它。 正好遇到了这个问题。 添加了 ICU 标签。完全错过了这个问题。 我在 OSX 上编译 android 的 49.1.2 再次遇到了同样的问题。 :( 【参考方案1】:

我们在 NDK 中使用 ICU。按照 ICU 交叉构建说明中的步骤操作,您会没事的。基本上,您将拥有一个 ICU 本机目录(例如 Windows 或 Linux)、一个 ICU Cygwin(如果使用此类)以及另一个用于 ICU Android (ARM) 的目录。听起来很疯狂,但它确实有效!

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

    补丁:

    来源/配置 (http://pastebin.com/kDEbYdMe) source/Makefile.in (http://pastebin.com/785Lnsb5) source/config/(将 mh-linux 复制到 mh-unknown) source/tools/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 的自定义构建脚本中。如果您遇到任何其他问题,我可能会告诉您问题所在。

祝你好运!

【讨论】:

我编辑了问题以显示当我尝试使用 NDK 构建 ICU 时会发生什么。 有趣的补丁,你应该考虑向他们提交一张票以贡献它们 我一定会的。我真正的希望是,Android 开发人员决定只公开一个完整的预装 ICU,因为它已经在设备上使用了。 目前还没有更新,但它仍然适用于较新版本的 NDK 或 ICU。我一直在推迟向 ICU 提交任何东西,因为他们一直在改变他们的构建系统以使这样的事情更容易。在不久的将来,我计划将一些项目升级到最新的 ICU,并尝试实施一些更清洁的东西并提交。 @tofutim 终于提交了这个补丁。它将在 ICU 52。bugs.icu-project.org/trac/ticket/9211

以上是关于android ndk 中的 unicode 支持的主要内容,如果未能解决你的问题,请参考以下文章

Android 中的 CTL(复杂文本语言)支持

Eclipse 中的 Android 项目缺少“添加本机支持”

Android Studio中的CmakeList NDK配置

android ndk 开发1

Android Studio NDK 入门教程--被NDK支持的C++运行库

不支持 Android 11(R) 的 NDK 构建