У Android на самом деле нет wchar_t? - PullRequest
7 голосов
/ 12 апреля 2011

Я создал простой метод, подобный приведенному нижеиз несовместимого типа указателя
примечание: ожидается «wchar_t *», но аргумент имеет тип «unsigned int *»

И полученная строка была неправильной.Если я удалил этот префикс L перед строкой форматирования, странно, это сработало.Но префиксы L использовались повсеместно в моем устаревшем коде.

Во-первых, я знаю, что wchar_t недостаточно переносим и очень специфичен для компилятора.Предполагалось, что размер wchar_t должен быть 16 бит.Я читал некоторые другие посты, в которых говорилось, что это 32-битная версия для Android, но wchar.h, предоставленный официальным NDK, сказал: wchar_t == char, правда?

Ответы [ 2 ]

15 голосов
/ 07 июня 2011

Из документов NDK r5b / 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 - это один байт, и ни одна из функций библиотеки широких символов не является реализованы. Это говорит о том, что реализация все еще может быть хитрой, поэтому я буду очень осторожен с использованием wchar_t на любой версии Android.

Если вы ищете альтернативу, я считаю UTFCPP отличной и очень легкой библиотекой.

0 голосов
/ 04 марта 2013

Это немного устарело, но я столкнулся с этим во время поиска решения.
Похоже, что NDK (для меня r8d) все еще не поддерживает wsprintf: см. выпуск и код .

В моем случае я использую libjson (учитывая переход на yajl) для общего кода iOS / Android.
Пока я не переключу библиотеки, мой обходной путь для NDK таков:

double value = 0.5; // for example
std::wstringstream wss;
wss << value;
return json_string(wss.str());

Я читал, что потоки медленнее, чем функции C, и если вам нужно чистое решение C (а не C ++), это не поможет, но, возможно, кто-то найдет это полезным.

...