Android没有真正的wchar_t吗?

时间:2011-04-12 04:01:13

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

我构建了一个简单的方法,如下面的

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,真的吗?

2 个答案:

答案 0 :(得分:15)

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

5.2/ wchar_t support:
- - - - - - - - - - -

As documented, the Android platform did not really support wchar_t until
Android 2.3. What this means in practical terms is that:

  - If you target platform android-9 or higher, the size of wchar_t is
    4 bytes, and most wide-char functions are available in the C library
    (with the exception of multi-byte encoding/decoding functions and
     wsprintf/wsscanf).

  - If you target any prior API level, the size of wchar_t will be 1 byte
    and none of the wide-char functions will work anyway.

We recommend any developer to get rid of any dependencies on the wchar_t type
and switch to better representations. The support provided in Android is only
there to help you migrate existing code.

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

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

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

答案 1 :(得分: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 ++)解决方案它没有帮助,但也许有人会觉得这很有用。