我建立了一个简单的方法如下
- 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是一个优秀且非常轻量级的库.