Решение об отсутствии поддержки std :: wstring в Android NDK? - PullRequest
5 голосов
/ 17 июня 2011

У меня есть игра, в которой std :: wstring используется в качестве базового строкового типа в тысячах мест, а также выполняются операции с wchar_t и его функциями: wcsicmp () wcslen () vsprintf () и т. Д.

Проблема в том, что wstring не поддерживается в R5c (последний ndk на момент написания этой статьи).

Я не могу изменить код для использования std :: string из-за интернационализации, и я бы сломал игровой движок, который используется во многих играх ...

Какие варианты у меня есть?

1 - Заменить строку и строку на мои собственные классы строки

Это дало бы мне лучшую независимость от платформы, но смешно переопределять колесо. Я уже начал с COW реализации строк. Мне нужно, чтобы он был COW, потому что я использую их в качестве ключей в hash_maps. Это, конечно, много работы и подвержено ошибкам ... но, похоже, я могу это сделать.

2 - Попытайтесь исправить NDK, перекомпилировав STLPort с моими собственными реализациями функций широких символов строки стандартной библиотеки C (wcslen, mbstowcs ...)

Это был бы предпочтительный способ ... но я понятия не имею, как это сделать: (

Как заменить функцию (скажем, wcslen) в libstdc ++. A или libstlport_static.a? (не уверен, где они находятся: ()

И также я не уверен, какие функции мне нужно переопределить, я знаю, что wcslen не работает, поэтому я думаю, что они должны быть все ...

3 - У вас есть другая идея?

Я не могу дождаться официального исправления для этого, и мне придется пойти с опцией # 1, если я не могу понять, как это сделать # 2.

Я где-то читал, что если вы нацелились на 2.3, вы можете использовать wstrings, но я должен нацелиться на Android 2.1.

PS: Забыл сказать, что мне, конечно, нужно использовать STL, но нет RTTI, и я могу жить без исключений.

Заранее спасибо!

Ответы [ 3 ]

1 голос
/ 29 июня 2011

Попробуйте CrystaX's NDK.У него была поддержка STL задолго до официального Google.Текущая версия (r5), основанная на официальной версии ndk r5, все еще является бета-версией 3, но имеет поддержку wchar_t.

http://www.crystax.net/android/ndk-r5.php

0 голосов
/ 27 июня 2011

Qt обеспечивает превосходное копирование при записи, международную строковую реализацию , QString , то есть LGPLed.

Youтеоретически может извлечь его из источника Qt и использовать в своем собственном проекте.Вы найдете реализацию QString в src/corelib/tools/qstring.h и .cpp в исходном коде .Вам также понадобятся QChar, QByteArray, QAtomic и QNamespace include / classes (все в папке corelib,), и вы должны определить QT_NO_STL_WCHAR при компиляции.(Для этого я бы скомпилировал вручную или используя свой собственный скрипт / Makefile.) Не просто, но как только вы запустите его и начнете работать, ваша жизнь станет намного проще.Это лучше, чем заново изобретать колесо, потому что оно имеет множество удобных функций и функций.

Вместо того, чтобы убирать только QString, вы также можете просто использовать модуль QtCore в целом.Посмотрите проект android-lighthouse для порта Qt на Android.(Кроме того, может быть лучше получить ваши источники оттуда, чем по вышеуказанной ссылке «vanilla», независимо от того, что вы делаете.)

0 голосов
/ 22 июня 2011

Я страдаю от той же проблемы, что и вы, но моя единственная другая мысль - загрузить строки через JNI (как jstring* на родной земле), а затем преобразовать их в символы UTF по мере необходимости. Взгляните на доступные строковые функции JNI здесь:
http://download.oracle.com/javase/1.5.0/docs/guide/jni/spec/functions.html#string_operations

...