我构建了一个简单的方法,如下面的
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,真的吗?
答案 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:
见issue
和code。
在我的情况下,我使用libjson(考虑切换到yajl)来获取iOS / Android共享本机代码。
在我切换库之前,我对NDK的解决方法是这样的:
double value = 0.5; // for example
std::wstringstream wss;
wss << value;
return json_string(wss.str());
我已经读过流比C函数慢,如果你需要一个纯C(而不是C ++)解决方案它没有帮助,但也许有人会觉得这很有用。