Hat Android nicht wirklich wchar_t?
Baute ich eine einfache Methode wie unten
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);
}
Bekam ich folgende Warnung
In der Funktion 'Java_com_example_hellojni_HelloJni_stringfromjni':
warning: passing argument 1 of 'logDebugInfo' from incompatible pointer type
Hinweis: erwartet 'wchar_t *' but argument ist vom Typ 'unsigned int *'
Und der resultierende string nicht korrekt war.
Wenn ich entfernt, die L Präfix vor, dass die Formatierung string, komisch, es hat funktioniert. Aber L-Präfixe verwendet wurden überall in meinem legacy-code.
Erste den ich kenne wchar_t ist nicht handlich genug und ist sehr compiler-spezifisch. Die Größe von wchar_t ich erwartet, war ja auch 16 bit. Ich habe einige andere Beiträge, die sagte, es ist 32 bit bei android, aber wchar.h, durch Staatliche NDK, hieß es wchar_t == char, wirklich?
- btw, ich bin targeting android 1.6 und höher
- Prüfen Sie diese Frage ALSO: stackoverflow.com/questions/5008616/...
- Schon versucht, fshort-wchar hat bei mir nicht funktioniert, keine Ahnung 🙁
- Getestet habe ich die Größe von wchar_t auf android durch die Verwendung von sizeof, es war 1...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Vom NDK r5b docs/STANDALONE-TOOLCHAIN.html:
Da Sie auf Android 1.6, es sieht aus, als wenn wchar_t ist nicht für Sie geeignet.
Sogar in der Android 2.3-Plattform ("android-9"), gibt es noch Hinweise in einer Reihe von Orten, einschließlich
wchar.h
, was bedeutet, dasswchar_t
ist ein byte und kein wide-character-library-Funktionen implementiert sind. Dies deutet darauf hin, dass die Umsetzung möglicherweise noch dodgy, so wäre ich sehr vorsichtig über die Verwendung von wchar_t auf alle Android-version.Wenn Sie auf der Suche nach einer alternative, die ich gefunden habe, UTFCPP sich um eine ausgezeichnete und sehr leicht-Bibliothek.
Dies ist ein wenig alt, aber ich habe Treffer dieser während der Suche nach einer Lösung.
Es scheint, dass die NDK (r8d für mich) immer noch nicht unterstützt wsprintf:
sehen Problem
und code.
In meinem Fall bin ich mit libjson (unter Berücksichtigung der Umstellung zu yajl) für iOS/Android freigegebenen nativen code.
Bis ich wechseln, Bibliotheken, mein workaround für NDK ist dies:
Ich habe gelesen, dass die streams langsamer sind als die C-Funktionen, und wenn Sie eine Reine C (nicht C++) Lösung, die es nicht hilft, aber vielleicht wird jemand findet das nützlich.