Cómo usar la biblioteca boost (incluido el rpp compartido) con Android NDK y STLPort


Esto es más una respuesta que una pregunta, porque lo he descubierto, al menos en cuanto a compilar limpiamente la biblioteca. El principal problema para mí era conseguir shared_ptr de trabajo.

Ingredientes:

Boost v. 1.45.0

La versión de STLport en http://www.anddev.org/viewtopic.php?p=29939.

Versión r4b del NDK.

Instrucciones:

En su Android.mk archivo añadir:

LOCAL_CFLAGS += -DBOOST_EXCEPTION_DISABLE -D_STLP_NO_EXCEPTIONS -DOS_ANDROID -D_STLP_USE_SIMPLE_NODE_ALLOC

Eliminar la llamada a __stl_throw_length_error en la línea 613 de stlport / stl / _string.h. Puede usar _STLP_NO_EXCEPTIONS si lo desea.

Editar boost/boost/smart_ptr/shared_ptr.hpp después de la línea 261 para deshacerse de la llamada a boost:: throw_exception en el constructor shared_ptr. Usé # ifndef BOOST_EXCEPTION_DISABLE alrededor de todo el cuerpo del método. (Pero vea la respuesta a continuación.)

A continuación, debe proporcionar algunas piezas que faltan. Cree un archivo de encabezado con lo siguiente:

#ifdef OS_ANDROID

#include <exception>

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

#endif

Y un archivo fuente con una clase de excepción reducida para soportar bad_alloc:

#ifdef OS_ANDROID

#include <exception>

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

#endif

Incluya el encabezado donde quiera que esté incluyendo boost/shared_ptr.hpp. Compila el código fuente y agrégalo a tu biblioteca.

Author: Gamma Draconis, 2010-12-03

4 answers

Resultó que este enfoque no funciona del todo cuando se compila una biblioteca depurable. La biblioteca de versiones se compila con-O2, lo que optimiza algunas infelicidades, pero la biblioteca de depuración se realiza con-O0, lo que revela algunos problemas adicionales. Además, no estaba muy contento de tener que editar los archivos de boost. Así que con algún estudio adicional, he llegado a la siguiente solución.

Primero, no edite ninguno de los archivos de boost. En su lugar, agregue lo siguiente al encabezado dentro del espacio de nombres std:

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

Luego agregue lo siguiente al archivo fuente:

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

Esto ahora compila y enlaza a la aplicación incluso con android:debuggable="true" en AndroidManifest.XML. No se ejecuta en el emulador, pero entonces no estaba haciendo eso antes de incluir esta biblioteca tampoco.

 39
Author: Gamma Draconis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-12-06 16:41:16

Notablemente, NDK r5 viene con STLPort, y el STL de GNU, por lo que los hacks aquí ya no serán necesarios ahora que hay a) soporte STL b) soporte de excepciones en el compilador NDK C++.

 3
Author: grrussel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-12-08 19:47:41

Otra solución para shared_ptr en particular es usar boost::intrusive_ptr en su lugar. Esto no siempre es posible, pero funcionó para mi situación.

 1
Author: Martin Stone,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-02-14 12:46:35

La versión actual de Android NDK (r9) ahora admite excepciones.

Las capacidades de los distintos tiempos de ejecución varían. Véase este cuadro:

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

Stlport se puede usar en binarys no GPL. Todavía está marcado como experimental, pero puedes usarlo con clang y gcc.

Véase http://developer.android.com/tools/sdk/ndk /

 0
Author: sweisgerber.dev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-10-23 14:33:28