安卓系统真的没有wchar_t吗?

7
我建立了一个如下的简单方法
wchar_t buf[1024] = {};
void logDebugInfo(wchar_t* fmt, ...)
{  
    va_list args;
    va_start(args, fmt);
    vswprintf( buf, sizeof(buf), fmt, args);
    va_end(args);
}

jstring Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env,
                                              jobject thiz )
{
    logDebugInfo(L"test %s, %d..", L"integer", 10);
    return (*env)->NewStringUTF(env, buf);
}

我收到了以下警告:
在函数“Java_com_example_hellojni_HelloJni_stringFromJNI”中: 警告:从不兼容的指针类型传递参数1给'logDebugInfo' 注意:期望的是'wchar_t *',但参数的类型是'unsigned int *'
并且生成的字符串不正确。如果我在格式化字符串之前删除了那个L前缀,奇怪的是它可以工作。但是在我的旧代码中,L前缀被广泛使用。
首先,我知道wchar_t在足够便携性和非常特定于编译器。我预期的wchar_t大小应该为16位。我读了一些其他帖子,说对于Android而言它是32位,但是由官方NDK提供的wchar.h说wchar_t == char,真的吗?

顺便提一下,我的目标是 Android 1.6 及以上版本。 - fifth
请查看这个 Stack Overflow 的问题:http://stackoverflow.com/questions/5008616/want-to-force-wchar-t-to-be-an-unsigned-short-using-the-android-ndk - Michael Burr
已经尝试过使用fshort-wchar,但对我没有用,不知道为什么 :( - fifth
我通过使用sizeof在Android上测试了wchar_t的大小,结果为1... - fifth
2个回答

15

来自 NDK r5b docs/STANDALONE-TOOLCHAIN.html:

5.2/ wchar_t 支持:
- - - - - - - - - - -
正如文档所述,Android 平台直到 Android 2.3 才真正支持 wchar_t。这在实际应用中意味着:
- 如果你的目标平台是 android-9 或更高版本,则 wchar_t 的大小为 4 字节,并且大多数宽字符函数都可在 C 库中使用(但多字节编码/解码函数和 wsprintf/wsscanf 除外)。
- 如果你的目标 API 级别低于 android-9,则 wchar_t 的大小将为 1 字节,无论如何都无法使用任何宽字符函数。
我们建议开发人员摆脱对 wchar_t 类型的任何依赖,并切换到更好的表示方式。Android 提供的支持仅用于帮助您迁移现有代码。

由于您的目标是 Android 1.6,因此 wchar_t 看起来不适合您。

即使在 Android 2.3 平台("android-9"),仍然有许多地方有注释,包括 wchar.h,暗示 wchar_t 是一个字节并且没有实现任何宽字符库函数。这表明实现可能仍然存在问题,因此我会非常谨慎地在任何 Android 版本上使用 wchar_t。

如果您正在寻找替代方案,我发现 UTFCPP 是一个非常优秀且非常轻量级的库。


我找不到UTF8-CPP的许可细节。你知道它是否有任何限制吗? - Shammi

0

这篇文章有点老了,但我在寻找解决方案时遇到了这个问题。
看起来NDK(对我来说是r8d)仍然不支持wsprintf: 请参见issuecode

在我的情况下,我正在使用libjson(考虑切换到yajl)用于iOS / Android共享本地代码。
在我切换库之前,我对NDK的解决方法是:

double value = 0.5; // for example
std::wstringstream wss;
wss << value;
return json_string(wss.str());

我读过流比C函数慢,如果你需要一个纯C(而不是C ++)的解决方案,它没有帮助,但也许有人会发现这个有用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接