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.
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.
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++.
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.
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.
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