如何在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。