Как использовать библиотеку наддува (включая shared_ptr) с Android NDK и STLport - PullRequest
57 голосов
/ 03 декабря 2010

Это скорее ответ, чем вопрос, потому что я разобрался с ним, по крайней мере, настолько, насколько правильно скомпилировал библиотеку. Основной проблемой для меня было заставить работать shared_ptr.

Состав:

Повышение v. 1.45.0

Версия STLport на http://www.anddev.org/viewtopic.php?p=29939.

Версия r4b НДК.

Направления:

В вашем файле Android.mk добавьте:

LOCAL_CFLAGS += -DBOOST_EXCEPTION_DISABLE -D_STLP_NO_EXCEPTIONS -DOS_ANDROID -D_STLP_USE_SIMPLE_NODE_ALLOC

Удалите вызов __stl_throw_length_error в строке 613 stlport / stl / _string.h. Вы можете использовать _STLP_NO_EXCEPTIONS, если хотите.

Отредактируйте boost / boost / smart_ptr / shared_ptr.hpp после строки 261, чтобы избавиться от вызова boost :: throw_exception в конструкторе shared_ptr. Я использовал #ifndef BOOST_EXCEPTION_DISABLE вокруг всего тела метода. (Но см. Ответ ниже.)

Далее вам нужно предоставить несколько недостающих частей. Создайте файл заголовка со следующим:

#ifdef OS_ANDROID

#include <exception>

namespace std
{
    struct bad_alloc : public exception { bad_alloc operator()(){}};
}

#endif

и исходный файл с урезанным классом исключений для поддержки bad_alloc:

#ifdef OS_ANDROID

#include <exception>

namespace std
{
    exception::exception() {}
    exception::~exception() {}
    const char* exception::what() const {}
}

#endif

Включите заголовок, куда бы вы ни включили boost / shared_ptr.hpp. Скомпилируйте исходный код и добавьте его в свою библиотеку.

Ответы [ 4 ]

39 голосов
/ 06 декабря 2010

Оказалось, что этот подход не совсем работает при компиляции отлаживаемой библиотеки. Библиотека релизов скомпилирована с -O2, которая оптимизирует некоторые ошибки, но библиотека отладки выполнена с -O0, что выявляет некоторые дополнительные проблемы. Кроме того, я не был слишком рад редактированию файлов надстройки. Поэтому, проведя дополнительное исследование, я нашел следующее решение.

Во-первых, не редактируйте файлы буста. Вместо этого добавьте следующее в заголовок в пространстве имен std:

struct bad_cast : public exception {bad_cast operator()(){}};

Затем добавьте следующее в исходный файл:

namespace boost
{
    void throw_exception(std::exception const&) {}
}

Теперь это компилируется и связывается с приложением даже с android: debuggable = "true" в AndroidManifest.xml. Он не работает в эмуляторе, но тогда я не делал этого до того, как я включил эту библиотеку.

3 голосов
/ 08 декабря 2010

Примечательно, что NDK r5 поставляется с STLport и GNU STL, и поэтому хаки здесь больше не понадобятся, когда есть: а) поддержка STL; б) поддержка исключений в компиляторе NDK C ++.

1 голос
/ 14 февраля 2011

Другим обходным решением для shared_ptr, в частности, является использование вместо него boost :: intrusive_ptr. Это не всегда возможно, но сработало для моей ситуации.

0 голосов
/ 23 октября 2013

Текущая версия Android NDK (r9) теперь поддерживает исключения.

Возможности различных сред выполнения могут различаться. Смотрите эту таблицу:

          C++       C++   Standard
          Exceptions  RTTI  Library
system    no           no        no
gabi++   yes          yes        no
stlport  yes          yes       yes
gnustl   yes          yes       yes

stlport может использоваться в не-GPL бинарниках. Он по-прежнему помечен как экспериментальный, но вы можете использовать его с clang и gcc.

См. http://developer.android.com/tools/sdk/ndk/

...