如何将boost库(包括shared_ptr)与Android NDK和STLport一起使用

时间:2010-12-03 15:43:24

标签: c++ boost android-ndk stlport

这更像是一个答案,而不是一个问题,因为我已经弄清楚了,至少就干净地编译图书馆而言。对我来说,主要问题是让shared_ptr工作。

成分:

Boost v.1.45.0

http://www.anddev.org/viewtopic.php?p=29939的STLport版本。

NDK的版本r4b。

路线:

在Android.mk文件中添加:

LOCAL_CFLAGS += -DBOOST_EXCEPTION_DISABLE -D_STLP_NO_EXCEPTIONS -DOS_ANDROID -D_STLP_USE_SIMPLE_NODE_ALLOC

在stlport / stl / _string.h的第613行删除对__stl_throw_length_error的调用。如果您愿意,可以使用_STLP_NO_EXCEPTIONS。

在第261行之后编辑boost / boost / smart_ptr / shared_ptr.hpp以消除对shared_ptr构造函数中对boost :: throw_exception的调用。我在方法的整个主体周围使用了#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 个答案:

答案 0 :(得分:39)

事实证明,在编译可调试库时,这种方法并不完全有效。发布库使用-O2编译,这可以优化一些不足,但调试库使用-O0完成,这会显示一些其他问题。此外,我不太高兴不得不编辑boost文件。因此,通过一些额外的研究,我提出了以下解决方案。

首先,不要编辑任何增强文件。而是将以下内容添加到std命名空间中的标头:

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

接下来将以下内容添加到源文件中:

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

现在,即使AndroidManifest.xml中的android:debuggable =“true”,这也会编译并链接到应用程序中。它不在模拟器中运行,但在我包含此库之前它没有这样做。

答案 1 :(得分:3)

值得注意的是,NDK r5附带了STLport和GNU STL,因此现在不再需要这些hack,因为在NDK C ++编译器中存在a)STL支持b)异常支持。

答案 2 :(得分:1)

另外,shared_ptr的另一种解决方法是使用boost :: intrusive_ptr。这并非总是可行,但适用于我的情况。

答案 3 :(得分:0)

当前版本的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/