Android NDK中缺少std :: wstring支持的解决方案?

时间:2011-06-17 12:20:24

标签: android-ndk wchar-t wstring stlport

我有一个游戏,它使用std :: wstring作为其基本字符串类型在数千个地方以及使用wchar_t及其函数进行操作:wcsicmp()wcslen()vsprintf()等。

问题是R5c不支持wstring(在撰写本文时最新的ndk)。

由于国际化,我无法将代码更改为使用std :: string,而且我会破坏许多游戏使用的游戏引擎......

我有哪些选择?

1 - 将string和wstring替换为我自己的字符串类

这会给我更好的平台独立性,但重新实现轮子是荒谬的。 我已经开始使用字符串的COW实现了。我需要它是COW,因为我将它们用作hash_maps中的键。 这当然是很多工作和容易出错......但似乎这是我能做的事情。

2 - 尝试修复NDK使用我自己的C标准库(wcslen,mbstowcs ...)的宽字符串函数实现重新编译STLPort

这将是更好的方式......但我不知道该怎么做:(

如何在libstdc ++。a或libstlport_static.a中替换函数(比如说wcslen)? (不确定它们在哪里:()

而且我不确定我需要重新实现哪些功能,我知道wcslen没有工作所以我猜他们应该全部......

3 - 您还有其他想法吗?

我迫不及待地想要正式解决这个问题,如果我不知道如何做#2,我将不得不选择#1。

我已经读到某个地方,如果你的目标是2.3,你可以使用wstrings,但我应该以Android 2.1为目标。

PS:忘了说我当然需要使用STL,但没有RTTI,我可以毫无例外地生活。

提前致谢!

3 个答案:

答案 0 :(得分:1)

尝试CrystaX的NDK。它早在官方谷歌之前就得到了支持。当前版本(r5)基于官方ndk r5,仍然是beta 3,但它确实有wchar_t支持。

http://www.crystax.net/android/ndk-r5.php

答案 1 :(得分:0)

我遇到了和你一样的问题,但我唯一的另一个想法是通过JNI加载字符串(在本地的jstring*),然后根据需要将它们转换为UTF字符。在这里查看可用的JNI字符串函数:
http://download.oracle.com/javase/1.5.0/docs/guide/jni/spec/functions.html#string_operations

答案 2 :(得分:0)

Qt 提供优秀的写时复制,国际友好string implementation QString ,即LGPL。

理论上,您可以从Qt源中提取它并在您自己的项目中使用它。您将在src/corelib/tools/qstring.h中找到QString实现,在Qt source download中找到.cpp。您还需要QCharQByteArrayQAtomicQNamespace包含/类(均位于corelib文件夹下),您应该定义{{ 1}}编译时(为此我会手工编译或使用我自己的脚本/ Makefile。)不简单,但一旦你开始运行你的生活会更简单。它比重新发明轮子更好,因为它带有许多便利功能和功能。

您可以将QtCore模块作为一个整体使用,而不是仅剥离QString。有关到Android的Qt端口,请参阅android-lighthouse project。 (另外,无论你做什么,最好从上面的“香草”链接获取你的资源。)