【问题标题】:Does Android not really have wchar_t?Android真的没有wchar_t吗?
【发布时间】:2011-04-12 04:01:12
【问题描述】:

我构建了一个如下所示的简单方法

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”中:
警告:从不兼容的指针类型传递“logDebugInfo”的参数 1
注意:预期为 'wchar_t *' 但参数类型为 'unsigned int *'

结果字符串不正确。 如果我在格式化字符串之前删除了那个 L 前缀,奇怪的是,它起作用了。但是在我的遗留代码中到处都使用了 L 前缀。

首先,我知道 wchar_t 的可移植性不够,而且是非常特定于编译器的。我期望的 wchar_t 的大小应该是 16 位。我读了一些其他帖子说它是 32 位的 android 但是 wchar.h,由官方 NDK 提供,它说 wchar_t == char,真的吗?

【问题讨论】:

  • 顺便说一句,我的目标是 android 1.6 及更高版本
  • 检查这个 SO 问题:stackoverflow.com/questions/5008616/…
  • 已经试过了,fshort-wchar 对我不起作用,不知道 :(
  • 我使用sizeof在android上测试了wchar_t的大小,它是1...

标签: android c java-native-interface android-ndk


【解决方案1】:

来自 NDK r5b 文档/STANDALONE-TOOLCHAIN.html:

5.2/ wchar_t 支持: - - - - - - - - - - - 如文件所述,直到 Android 平台才真正支持 wchar_t 安卓 2.3。这实际上意味着: - 如果您的目标平台为 android-9 或更高版本,wchar_t 的大小为 4 个字节,C 库中提供了大多数宽字符函数 (除了多字节编码/解码功能和 wsprintf/wsscanf)。 - 如果您针对任何先前的 API 级别,wchar_t 的大小将为 1 字节 无论如何,宽字符函数都不起作用。 我们建议任何开发人员摆脱对 wchar_t 类型的任何依赖 并切换到更好的表示。 Android 中提供的支持仅 那里可以帮助您迁移现有代码。

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

即使在Android 2.3平台(“android-9”)中,很多地方仍然有注释,包括wchar.h,这意味着wchar_t是一个字节,没有一个宽字符库函数是实施的。这表明实现可能仍然很狡猾,所以我会非常谨慎地在 any Android 版本上使用 wchar_t。

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

【讨论】:

  • 我找不到 UTF8-CPP 的许可详细信息。不知道有没有限制?
【解决方案2】:

这有点旧,但我在寻找解决方案时遇到了这个问题。
看来 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++)解决方案,它无济于事,但也许有人会发现这很有用。

【讨论】:

    猜你喜欢
    • 2012-12-07
    • 2011-06-16
    • 2011-07-16
    • 2015-12-04
    • 2011-04-01
    • 2016-10-02
    • 1970-01-01
    • 2018-01-05
    相关资源
    最近更新 更多