USTL или STLPort для Android?

Я работаю с Android NDK, и поскольку в настоящее время он не поддерживает STL, мне было интересно, есть ли там блестящие люди, которые добились успеха в этом или знают, что лучше подходит для платформы Android: uSTL или STLPort.

EDIT: Похоже, что другой вариант может быть CrystaX .NET .

На своем веб-сайте:

… настраиваемая дистрибуция Android NDK r3, которую я перестроил из официальных источников. Добавлена ​​поддержка исключений C ++, RTTI и стандартной библиотеки C ++.

Solutions Collecting From Web of "USTL или STLPort для Android?"

STLport поддерживается с Android2.3 сейчас !!!

Порты STL официально доступны в Android NDK с версии r5 on. Его можно использовать как статическую или разделяемую библиотеку. Следующие реализации доступны с помощью NDK:

  • STLport , на основе v5.2.0:
    • Static stlport_static : используйте, если в вашем проекте имеется только одна динамическая библиотека.
    • Dynamic stlport_shared : использовать, если в вашем проекте имеется более одной динамической библиотеки.
  • system GNU libstdc ++ (статическая библиотека)

Рекомендуемый, простой способ использовать его во время сборки – это определить APP_STL в Application.mk, например:

 APP_STL := stlport_static 

И если вы хотите его перестроить (это необязательно), определите STLPORT_FORCE_REBUILD в своем Application.mk:

 STLPORT_FORCE_REBUILD := true 

Также доступна платформа тестирования модулей для STLport.

Текущие ограничения для STLport :

  • Исключения C ++ не поддерживаются
  • RTTI не поддерживается
  • «Вероятные ошибки» в поддержку wchar_t и локалей

Различные ссылки:

Документация доступна в пакетах NDK в следующих местах (их может быть больше):

  • docsCPLUSPLUS-SUPPORT.html
  • Источники / CXX-СТЛ / STLport
  • Источники / CXX-СТЛ / гну-libstdc ++

Загрузите NDK + docs здесь ; Ошибки в файлах здесь


Ниже приведен фрагмент документа docs / CPLUSPLUS-SUPPORT.html (из документов NDK, r5)

III. Выбор реализации стандартной библиотеки C ++:

По умолчанию заголовки и библиотеки для минимальной системной библиотеки времени выполнения C ++ (/system/lib/libstdc++.so) используются при создании источников C ++.

Однако вы можете выбрать другую реализацию, установив переменную APP_STL на что-то еще в Application.mk, например:

APP_STL: = stlport_static

Чтобы выбрать статическую реализацию STLport, предоставляемую этим NDK. Значения значения APP_STL:

System -> Использовать минимальную библиотеку времени выполнения C ++ по умолчанию. Stlport_static -> Использовать STLport, созданный как статическая библиотека. Stlport_shared -> Использовать STLport, созданный как разделяемая библиотека.

ПРЕДУПРЕЖДЕНИЕ: ВАЖНАЯ ПЕЧЬ

  AT THE MOMENT, OUR STLPORT IMPLEMENTATION DOES NOT SUPPORT EXCEPTIONS AND RTTI. PLEASE BE SURE TO NOT USE -fexceptions OR -frtti IN ALL MODULES THAT USE IT. 

ПРЕДУПРЕЖДЕНИЕ: КОНЕЦ ВАЖНОЙ ПЕЧИ

«Stlport_shared» предпочтительнее, если в вашем проекте есть несколько разделяемых библиотек, в которых используется C ++ STL, поскольку он позволяет избежать дублирования функций и, что более важно, глобальных переменных (например, std :: cout) в каждом из них, что может иметь неожиданные результаты ,

С другой стороны, вам придется загружать его явно при запуске приложения, как в следующем примере:

  static { System.loadLibrary("stlport_shared"); System.loadLibrary("foo"); System.loadLibrary("bar"); } 

Там, где «libfoo.so» и «libbar.so» зависят от «libstlport_shared.so».

Обратите внимание, что имя общей библиотеки, если «libstlport_shared.so», чтобы избежать именования конфликтов с некоторыми изображениями системы Android, которые включают системный уровень libstlport.so (который, как оказалось, не является ABI-стабильным и не может использоваться из машинного кода, созданного NDK) ,

«Stlport_static» предпочтительнее, если в вашем проекте имеется только одна общая библиотека: только функции STL и необходимые вам переменные будут связаны с вашим машинным кодом, уменьшая его размер кода, и вам не нужно будет загружать динамический stlport_shared в запускать.

Внутривенно Проблемы, связанные с STLport:

Этот NDK предоставляет готовые статические и разделяемые библиотеки для STLport, но вы можете принудительно его перестроить из источников, указав в своей среде или вашем Application.mk следующее:

 STLPORT_FORCE_REBUILD := true 

STLport лицензируется под лицензией open-source типа BSD. Дополнительные сведения о библиотеке см. В источниках / cxx-stl / stlport / README.

V. Планы на будущее:

  • Сделать STLport совместимым с исключениями C ++ и RTTI
  • Полная поддержка GNU libstdc ++
  • Поддержка uSTL?

Просто отметьте, что uSTL немного отличается от стандарта. Например, он предполагает кодировку UTF-8 для std :: string. Все еще выглядит интересно, хотя …

Недавно я столкнулся с некоторыми вспомогательными скриптами и портом STLport для Android от Джона Рипли.

Существует также связанное сообщение в блоге с инструкциями по его настройке .

Полагаю, это может облегчить переход с STLport.

Вот как я настроил STLPort для работы с Android Froyo.

 // The code // The set of definitions and includes for STLPort // They used defined() instead of #ifdef. #define _STLP_HAS_INCLUDE_NEXT 1 #define _STLP_USE_MALLOC 1 #define _STLP_USE_NO_IOSTREAMS 1 #include <stl/config/_android.h> #include <map> #include <string> // Android.mk # For Android STL support LOCAL_C_INCLUDES += external/stlport/stlport LOCAL_SHARED_LIBRARIES += libstlport 

Андрей

Обратите внимание, что упоминание репозитория git в ссылке из ответа Степана Райко больше не существует. Альтернативные источники находятся на anddev и, через git, на git: //stlport.git.sourceforge.net/gitroot/stlport/stlport. Я нашел последнее в более продолжительном обсуждении использования stlport и boost под Android.

Начиная с первого ответа на этот вопрос, я получил START-файл anddev для работы с моей библиотекой, которая также вызывает повышение, включая проблемную shared_ptr. Для получения подробной информации о моем решении см. Этот вопрос .