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

Android ndk Android NDK中缺少std::wstring支持的解决方案?,android-ndk,wchar-t,wstring,stlport,Android Ndk,Wchar T,Wstring,Stlport,我有一个游戏,它使用std::wstring作为它的基本字符串类型,在上千个地方使用wchar\u t及其函数进行操作:wcsicmp()wcslen()vsprintf(),等等 问题是R5c中不支持wstring(写入时的最新ndk) 由于国际化的原因,我无法将代码更改为使用std::string,我将破坏许多游戏使用的游戏引擎 我有哪些选择 1-用我自己的字符串类替换字符串和wstring 这将给我更好的平台独立性,但重新实现轮子是荒谬的。 我已经开始使用字符串的COW实现。我需要它是CO

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

问题是R5c中不支持wstring(写入时的最新ndk)

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

我有哪些选择

1-用我自己的字符串类替换字符串和wstring

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

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

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

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

还有,我不确定我需要重新实现哪些功能,我知道wcslen不起作用,所以我想它们应该都是

3-你还有其他想法吗?

我迫不及待地想要一个正式的解决方案,如果我不知道怎么做,我将不得不选择选项1

我在某个地方读到,如果你以2.3为目标,你可以使用wstring,但我应该以android2.1为目标

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


提前感谢!

我遇到了与您相同的问题,但我唯一的其他想法是通过JNI加载字符串(在native land中为
jstring*
),然后根据需要将其转换为UTF字符。请查看此处可用的JNI字符串函数:

Qt提供了一个非常好的编写时拷贝,国际友好,QString,即LGPLed

理论上,您可以从Qt源代码中提取它并在您自己的项目中使用它。您可以在a中的
src/corelib/tools/QString.h
.cpp
中找到QString实现。您还需要
QChar
QByteArray
qtomic
,以及
QNamespace
包含/classes(都在
corelib
文件夹下),编译时应该定义
QT\u NO\u STL\u WCHAR
。(为此,我会手动或使用自己的脚本/生成文件进行编译。)这并不简单,但一旦你开始使用它,你的生活就会简单得多。这比重新发明轮子要好,因为它有很多方便的功能和特性


与只剥离QString不同,您也可以将QtCore模块作为一个整体使用。有关Android的Qt端口,请参阅。(此外,无论您做什么,从那里获取源代码可能比从上面的“普通”链接更好。)

试试CrystaX的NDK。它早在正式的google版本之前就已经有了stl支持。目前的版本(r5)基于官方NDK r5的版本,仍然是beta 3,但它确实有wchar\t支持


在你的应用程序中设置
APP\u STL:=stlport\u static
是否无效?它为我编译
std::wstring test=L“test”
。@Martin Stone stlport编译得很好,但
std::wstring test=L“test”断言(test.size()!=1);//失败!!!!!
跟踪它wsclen也失败了,它返回1(我猜他们只是对char*进行了一些转换)进一步的调查显示stl_端口使用了标准C库中的许多函数(不知道有多少函数,也不知道具体是哪些函数)……是否可以简单地将所有WString转换为字符串(使用
setlocale()
+
wcsrtombs()
)在您的程序中定义良好的接口点?这样,您可以在内部保留所有内容,并且只在需要输出字符串时添加一点修改。抱歉,wcsrtombs不起作用,但如果是这样的话,我可以创建utf8转换器的实现(实际上我已经编写了代码),问题是我在1500多个使用std::wstring的地方都有std::wstring,如果我修改它的行为,我需要检查每一个std::wstring。因此,我需要的是在NDK中找到一个C宽字符函数的替代品,并重新编译STL(我不知道如何做)…或者另一个解决方案是编写我自己的std::wstring类来模拟std行为,正如我上面所说的。@user548569:我可能误解了你的问题。你是否声称你的平台没有
wchar\u t
(和
std::wstring
)所以你甚至不能编译你的代码?谢谢,我已经用我自己的utf8字符串实现了。@user548569:你可以发布你自己的实现作为答案吗?如果你已经找到了最好的方法,回答你自己的问题是可以的!如何将数千个位置更改为Qt调用是一个好的解决方案?有很多i18n库可以使用ecommend,但这不是问题。(我喜欢Qt,但这只是一个不相关的答案。)请确认CrystaX NDK真的有wcsicmp()?我没有看到。这是一个如何解决数百个std::wstring和wcsicmp使用的解决方案?