57 votes

Comment utiliser la bibliothèque boost (y compris shared_ptr) avec le NDK Android et STLport

Il s'agit plus d'une réponse que d'une question, car j'ai trouvé la solution, du moins en ce qui concerne la compilation propre de la bibliothèque. Le principal problème pour moi était de faire fonctionner shared_ptr.

Ingrédients :

Boost v. 1.45.0

La version de STLport à http://www.anddev.org/viewtopic.php?p=29939 .

Version r4b du NDK.

Directions :

Dans votre fichier Android.mk, ajoutez :

LOCAL_CFLAGS += -DBOOST_EXCEPTION_DISABLE -D_STLP_NO_EXCEPTIONS -DOS_ANDROID -D_STLP_USE_SIMPLE_NODE_ALLOC

Supprimez l'appel à __stl_throw_length_error à la ligne 613 de stlport/stl/_string.h. Vous pouvez utiliser _STLP_NO_EXCEPTIONS si vous le souhaitez.

Editez boost/boost/smart_ptr/shared_ptr.hpp après la ligne 261 pour supprimer l'appel à boost::throw_exception dans le constructeur de shared_ptr. J'ai utilisé #ifndef BOOST_EXCEPTION_DISABLE tout autour du corps de la méthode. (Mais voyez la réponse ci-dessous).

Ensuite, vous devez fournir certaines pièces manquantes. Créez un fichier d'en-tête avec ce qui suit :

#ifdef OS_ANDROID

#include <exception>

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

#endif

et un fichier source avec une classe d'exception dépouillée pour supporter bad_alloc :

#ifdef OS_ANDROID

#include <exception>

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

#endif

Incluez l'en-tête là où vous incluez boost/shared_ptr.hpp. Compilez le source et ajoutez-le à votre bibliothèque.

39voto

Gamma Draconis Points 786

Il s'est avéré que cette approche ne fonctionne pas entièrement lors de la compilation d'une bibliothèque débuggable. La bibliothèque de sortie est compilée avec -O2, ce qui permet d'optimiser certaines infélicités, mais la bibliothèque de débogage est compilée avec -O0, ce qui révèle quelques problèmes supplémentaires. De plus, je n'étais pas très heureux de devoir éditer les fichiers boost. Donc, après quelques études supplémentaires, j'ai trouvé la solution suivante.

D'abord, ne modifie aucun des fichiers boost. Ajoutez plutôt ce qui suit à l'en-tête de l'espace de noms std :

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

Ensuite, ajoutez ce qui suit au fichier source :

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

Cela compile maintenant et se lie à l'application même avec Android:debuggable="true" dans AndroidManifest.xml. Elle ne fonctionne pas dans l'émulateur, mais elle ne le faisait pas non plus avant d'inclure cette bibliothèque.

3voto

grrussel Points 3315

Notamment, NDK r5 est livré avec STLport, et la STL GNU, et donc les hacks ici ne seront plus nécessaires maintenant qu'il y a a) le support de la STL b) le support des exceptions dans le compilateur C++ de NDK.

1voto

Martin Stone Points 5779

Une autre solution pour les shared_ptr en particulier est d'utiliser boost::intrusive_ptr à la place. Ce n'est pas toujours possible, mais cela a fonctionné pour ma situation.

0voto

sebweisgerber Points 319

La version actuelle d'Android NDK (r9) prend désormais en charge les exceptions.

Les capacités des différents moteurs d'exécution varient. Voir ce tableau :

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

stlport peut être utilisé dans les binaires non-GPL. Il est toujours marqué comme expérimental, mais vous pouvez l'utiliser avec clang et gcc.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X