Я создал простой метод, как показано ниже
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':
предупреждение: передача аргумента 1 logDebugInfo из несовместимого типа указателя
примечание: ожидалось 'wchar_t *', но аргумент имеет тип 'unsigned int *'
И результирующая строка была неверной. Если бы я удалил этот префикс L перед этой строкой форматирования, как ни странно, это сработало. Но префиксы L использовались повсюду в моем устаревшем коде.
Во-первых, я знаю, что wchar_t недостаточно переносим и сильно зависит от компилятора. Я ожидал, что размер wchar_t должен быть 16 бит. Я читал некоторые другие сообщения, в которых говорилось, что это 32 бита для Android, но wchar.h, предоставленный официальным NDK, сказал: wchar_t == char, правда?