我有一个游戏,它使用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,我可以毫无例外地生活。
提前致谢!
答案 0 :(得分:1)
尝试CrystaX的NDK。它早在官方谷歌之前就得到了支持。当前版本(r5)基于官方ndk r5,仍然是beta 3,但它确实有wchar_t支持。
答案 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
。您还需要QChar
,QByteArray
,QAtomic
和QNamespace
包含/类(均位于corelib
文件夹下),您应该定义{{ 1}}编译时(为此我会手工编译或使用我自己的脚本/ Makefile。)不简单,但一旦你开始运行你的生活会更简单。它比重新发明轮子更好,因为它带有许多便利功能和功能。
您可以将QtCore模块作为一个整体使用,而不是仅剥离QString。有关到Android的Qt端口,请参阅android-lighthouse project。 (另外,无论你做什么,最好从上面的“香草”链接获取你的资源。)