USTL или STLPort для Android?

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

РЕДАКТИРОВАТЬ: Похоже, что другой вариант может быть CrystaX.NET.

С их сайта:

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

6 ответов

Решение

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

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

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

Рекомендуемый простой способ использовать его во время сборки - определить 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/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" предпочтительнее, если в вашем проекте есть несколько общих библиотек, использующих STL C++, потому что это позволяет избежать дублирования функций и, что более важно, глобальных переменных (например, 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 лицензируется в соответствии с BSD-стиле с открытым исходным кодом. См. Sources/cxx-stl/stlport/README для более подробной информации о библиотеке.

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

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

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

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

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

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

Так я настроил 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.

С тех пор как я впервые ответил на этот вопрос, я заставил anddev STLPort работать с моей библиотекой, которая также вызывает boost, включая проблемный shared_ptr. Для деталей моего решения см. Этот вопрос.

Другие вопросы по тегам