u16string и char16_t в Android NDK

Я хочу создать (std::getline()) и манипулировать строками UTF-16 в Android NDK, чтобы я мог (относительно) безболезненно передать их обратно в Java для отображения. В настоящее время я использую C++0x с переключателем LOCAL_CPPFLAGS := -std=c++0x, который работает (я использую некоторые другие функции 0x). Кажется, компилятор не может найти u16string. Я включил <string> и не получил никаких других ошибок. Я хочу сделать что-то вроде:


ifstream file(fileName);
if(!file.is_open()) {
    return false;
}
while(!file.eof()) {
    u16string fileLine;
    std::getline(file, fileLine);

    // Do stuff with fileLine
}
return true;

Включает ли NDK устаревшую версию GCC или что-то в этом роде? Что я должен делать?


person Warpspace    schedule 06.04.2011    source источник


Ответы (1)


NDK не поддерживает (по крайней мере, официально) широкие символы, UTF-16 или что-то в этом роде. Он также не предоставляет правильную библиотеку C++.

person sstn    schedule 06.04.2011
comment
Мне сказали, что NDK использует GCC, который в режиме C++0x изначально поддерживает UTF-16. Я думаю, я надеюсь, что есть какой-то препроцессор-фу или что-то, что можно сделать, чтобы он распознавал strings полный способ С++ 0x, когда в этом (официально экспериментальном) режиме - person Warpspace; 07.04.2011
comment
@Warpspace NDK (по крайней мере, мой устаревший NDK 4b) поставляется с gcc-4.4.0, который действительно должен поддерживать новые типы символов C++0x char16_t и char32_t, но для него нет библиотеки. Android NDK даже не знает std::string. Вероятно, проще всего было бы использовать UTF-8 — JNI поддерживает оба способа. В противном случае вы можете использовать stlport (без поддержки C++0x), чтобы предоставить вам std::string или std::basic_string, определить/реализовать char_traits для char16_t и определить свою собственную u16string как basic_string‹char16_t›. Не уверен, что stlport поддерживает wchar_t/wstring. - person sstn; 07.04.2011
comment
@Warpspace Вы также можете попробовать неофициальные (не Google) сборки NDK, например. КристаХ. См. crystax.net/android/ndk-r4.php. Они утверждают, что полностью совместимы с официальным NDK и добавили полную поддержку C++, RTTI и исключений. - person sstn; 07.04.2011
comment
Присмотрелся к обоим. Мне удалось получить доступ к функциям C++0x GCC 4.4.0, но вы правы, нет UTF-16 (библиотека) strings. JNI не уважает UTF-8 должным образом, так как он должен быть модифицированным UTF-8, что отличается. Я написал свой собственный код для чтения строк UTF-16 (с прямым порядком байтов) как (правильный) UTF-8, а затем преобразовал двойные байты (слова) в UTF-16. Не самое красивое решение, но приличное и надежное (настолько же, насколько строки в стиле C, что я в конечном итоге и использовал). Код могу выложить, если кому интересно. - person Warpspace; 11.04.2011
comment
Итак, какое решение здесь. У меня NDK R7 и последний Cyrstax, и я не вижу никакой поддержки для сравнений, таких как wcsicmp, wcscasecmp? - person Androider; 24.11.2011