USTL или STLPort для Android?

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

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

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

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

Ответ 1

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

Ответ 2

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

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

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

APP_STL := stlport_static

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

STLPORT_FORCE_REBUILD := true

Также доступна структура unit test для STLport.

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

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

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

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

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

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


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

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

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

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

APP_STL: = stlport_static

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

system → Использовать минимальную библиотеку времени выполнения С++ по умолчанию.  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, поскольку он позволяет избежать дублирования функций и, что более важно, глобальных переменных (например, 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 при запуске.

IV. Проблемы с STLport:

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

STLPORT_FORCE_REBUILD := true

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

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

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

Ответ 3

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

Ответ 5

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

Эндрю

Ответ 6

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

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