Вопрос

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

Редактировать:Похоже, другим вариантом может быть Кристакс .NET.

С их веб-сайта:

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

Это было полезно?

Решение

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

Другие советы

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

  • СТЛпорт, основанный на версии 5.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-stl/stlport
  • исходные тексты/cxx-stl/gnu-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 ПРИЛОЖЕНИЕ_STL := stlport_static

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

система -> Использовать минимальную библиотеку времени выполнения 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 (который, оказывается, нестабилен и не может быть использован из сгенерированного NDK машинного кода).

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

IV.Проблемы, связанные с STLPort:

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

STLPORT_FORCE_REBUILD := true

STLPort лицензируется по лицензии с открытым исходным кодом в стиле 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, упомянутый в ссылке из ответа Степана Райко, больше не существует.Альтернативные источники находятся на андев и, через git, в git://stlport.git.sourceforge.net/gitroot/stlport/stlport.Я нашел последнее в более продолжительное обсуждение об использовании как stlport, так и boost под Android.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top