Android没有真正的wchar_t吗?

我建立了一个简单的方法如下
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);
}

我得到了以下警告

In function ‘Java_com_example_hellojni_HelloJni_stringFromJNI’:
warning: passing argument 1 of ‘logDebugInfo’ from incompatible pointer type
note: expected ‘wchar_t *’ but argument is of type ‘unsigned int *’

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

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

解决方法

来自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一个优秀且非常轻量级的库.

相关文章

Android性能优化——之控件的优化 前面讲了图像的优化,接下...
前言 上一篇已经讲了如何实现textView中粗字体效果,里面主要...
最近项目重构,涉及到了数据库和文件下载,发现GreenDao这个...
WebView加载页面的两种方式 一、加载网络页面 加载网络页面,...
给APP全局设置字体主要分为两个方面来介绍 一、给原生界面设...
前言 最近UI大牛出了一版新的效果图,按照IOS的效果做的,页...