android ndk 中的 unicode 支持
我有一个大型 C/C++ 库,需要将其用作 Android NDK 项目的一部分。该库需要能够智能地处理 UTF8 字符串(例如,转换为小写/大写)。
该库具有条件编译功能,可以转至操作系统 API 来进行转换,但似乎没有任何适用于 UTF8 的 Android API。 (mbstowcs 等)
此线程表示使用 JNI 方法do it (!),这是一个相当重量级的解决方案。
我正在考虑构建 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
I have a large C/C++ library that I need to use as part of an Android NDK project. This library needs to be able to intelligently process UTF8 strings (for example, conversion to lowercase/uppercase).
The library has conditional compilation to punt to an OS API to do the conversion, but there don't seem to be any Android APIs for UTF8. (mbstowcs, etc)
This thread says to use JNI methods to do it (!), which is a rather heavy-weight solution.
I was thinking about building ICU, but as it uses GNU Autotools I'm not sure I can make it work with the NDK toolchain. :/
Has anyone else confronted this problem and done something other than use JNI?
EDIT: My attempts to get ICU to compile fail at the configure step:
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
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
我们在 NDK 中使用 ICU。按照 ICU 交叉构建说明中的步骤操作就可以了。基本上,您将拥有一个 ICU 本机目录(例如 Windows 或 Linux)、一个 ICU Cygwin(如果使用此类目录)和另一个 ICU Android (ARM) 目录。听起来很疯狂,但它确实有效!
以下是在 Cygwin 下构建的步骤。我正在使用“CrystaX”NDK r4,但它也应该使用开箱即用的 NDK 进行构建。 ICU 版本 4.4,但也适用于以前的版本。
补丁:
构建您的ICU 主机版本(例如 Windows)正常。 (我们将其称为 $HOST_ICU)
构建 Cygwin ICU:
构建 ICU 的 NDK 版本:< /p>
我使用类似的东西来传递(到步骤#4)CPPFLAGS/CXXFLAGS/CFLAGS:
对于LDFLAGS:
以及额外的配置参数:
我已经有一段时间没有手动完成此操作了,它目前都在基于自定义Python的构建中脚本。如果您遇到任何其他麻烦,我可能可以告诉您问题是什么。
祝你好运!
We are using ICU in the NDK. Follow the steps in the ICU cross building instructions and you'll be OK. Basically you'll have a ICU native directory (for example Windows or Linux), a ICU Cygwin (if using such) and yet another for ICU Android (ARM). Sounds crazy, but it works!
Here are the steps for building under Cygwin. I am using the 'CrystaX' NDK r4, but it should build with the out of the box NDK as well. ICU version 4.4, but has worked with previous versions as well.
Patches:
Build your host version of ICU (e.g. Windows) as per normal. (We'll call this $HOST_ICU)
Build Cygwin ICU:
Build NDK version of ICU:
I use something like this for passed in (to step #4) CPPFLAGS/CXXFLAGS/CFLAGS:
And for LDFLAGS:
And additional configure params:
I haven't done this manually for a while, it's currently all in a custom Python based build script. If you run into any other troubles, I can probably tell you what the issue is.
Good luck!