如何在Android NDK和STLport中使用boost库(包括shared_ptr)

这不仅仅是一个答案,而是一个问题,因为我已经弄明白了,至less就整个库的编译而言。 主要的问题是让shared_ptr工作。

配料:

Boost v。1.45.0

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

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。 (但请参阅下面的答案。)

接下来,你需要提供一些缺失的部分。 使用以下命令创build一个头文件:

 #ifdef OS_ANDROID #include <exception> namespace std { struct bad_alloc : public exception { bad_alloc operator()(){}}; } #endif 

和一个带有精简exception类的源文件来支持bad_alloc:

 #ifdef OS_ANDROID #include <exception> namespace std { exception::exception() {} exception::~exception() {} const char* exception::what() const {} } #endif 

包括标题,无论你包括boost / shared_ptr.hpp。 编译源代码并将其添加到您的库中。

事实certificate,这种方法在编译可debugging库时不能完全起作用。 发行库是用-O2编译的,它优化了一些不足之处,但是debugging库是用-O0完成的,这揭示了一些额外的问题。 此外,我不太乐意编辑boost文件。 所以有一些额外的研究,我已经想出了以下解决scheme。

首先,不要编辑任何boost文件。 相反,将以下内容添加到标准名称空间中的标题:

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

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

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

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

值得注意的是,NDK r5自带STLport和GNU STL,所以这里的黑客不再需要,因为在NDK C ++编译器中有STL支持b)exception支持。

shared_ptr的另一个解决方法是使用boost :: intrusive_ptr代替。 这并不总是可能的,但为我的情况工作。

Android NDK(r9)的当前版本现在支持exception。

各种运行时的function各不相同。 见下表:

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

stlport可以在非GPL二进制文件中使用。 它仍然被标记为experimantal,但你可以使用它与clang和gcc。

请参阅http://developer.android.com/tools/sdk/ndk/