web-dev-qa-db-fra.com

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

C’est plus une réponse qu’une question, car j’ai compris, au moins jusqu’à compiler proprement 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 sur 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 shared_ptr. J'ai utilisé #ifndef BOOST_EXCEPTION_DISABLE dans tout le corps de la méthode. (Mais voir la réponse ci-dessous.)

Ensuite, vous devez fournir des pièces manquantes. Créez un fichier d'en-tête avec les éléments suivants:

#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 simplifiée pour prendre en charge bad_alloc:

#ifdef OS_Android

#include <exception>

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

#endif

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

57
Gamma Draconis

Il s'est avéré que cette approche ne fonctionnait pas entièrement lors de la compilation d'une bibliothèque débogable. La bibliothèque de versions est compilée avec -O2, ce qui optimise certains inconvénients, mais la bibliothèque de débogage est réalisée avec -O0, ce qui révèle certains problèmes supplémentaires. De plus, je n'étais pas trop content d'avoir à éditer les fichiers boost. Donc, avec une étude supplémentaire, j'ai trouvé la solution suivante.

Tout d'abord, ne modifiez 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&) {}
}

Ceci compile et lie maintenant dans l'application même avec Android: debuggable = "true" dans AndroidManifest.xml. Il ne fonctionne pas dans l'émulateur, mais ce n'était pas le cas avant que j'inclus cette bibliothèque. 

39
Gamma Draconis

NDK r5 est livré avec STLport et le GNU STL. Les hacks ici ne seront plus nécessaires maintenant qu’il existe un) support STL b) des exceptions dans le compilateur NDK C++.

3
grrussel

Une autre solution de contournement pour shared_ptr en particulier consiste à utiliser boost :: intrusive_ptr. Ce n'est pas toujours possible, mais a fonctionné pour ma situation.

1
Martin Stone

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

Les capacités des différentes exécutions 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 des binaires non-GPL. Il est toujours marqué comme expérimental, mais vous pouvez l'utiliser avec clang et gcc.

Voir http://developer.Android.com/tools/sdk/ndk/

0
sweisgerber.dev