首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Android NDK和STLport中使用boost库(包括shared_ptr)

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

Stack Overflow用户
提问于 2010-12-03 23:43:24
回答 4查看 15.8K关注 0票数 58

这与其说是一个问题,不如说是一个答案,因为我已经弄清楚了,至少在干净利落地编译库方面是这样。对我来说,主要的问题是让shared_ptr正常工作。

成分:

Boost版本1.45.0

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

NDK的r4b版本。

说明:

在您的Android.mk文件中添加:

代码语言:javascript
复制
LOCAL_CFLAGS += -DBOOST_EXCEPTION_DISABLE -D_STLP_NO_EXCEPTIONS -DOS_ANDROID -D_STLP_USE_SIMPLE_NODE_ALLOC

在stlport/stl/_ __stl_throw_length_error .h的第613行删除对字符串的调用。如果你愿意,你可以使用_STLP_NO_EXCEPTIONS。

编辑第261行之后的boost/boost/smart_ptr/shared_ptr.hpp,以消除shared_ptr构造函数中对boost::throw_exception的调用。我在整个方法体周围使用了#ifndef BOOST_EXCEPTION_DISABLE。(但请参阅下面的答案。)

接下来,您需要补充一些缺失的部分。创建一个包含以下内容的头文件:

代码语言:javascript
复制
#ifdef OS_ANDROID

#include <exception>

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

#endif

以及一个包含支持bad_alloc的精简异常类的源文件:

代码语言:javascript
复制
#ifdef OS_ANDROID

#include <exception>

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

#endif

在您要包含boost/shared_ptr.hpp的任何位置都包含头文件。编译源代码并将其添加到库中。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-12-07 00:41:17

事实证明,在编译可调试库时,这种方法并不完全有效。发行库是用-O2编译的,这优化了一些不足之处,但是调试库是用-O0编译的,这暴露了一些额外的问题。此外,我对不得不编辑boost文件并不是很满意。因此,通过一些额外的研究,我提出了以下解决方案。

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

代码语言:javascript
复制
struct bad_cast : public exception {bad_cast operator()(){}};

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

代码语言:javascript
复制
namespace boost
{
    void throw_exception(std::exception const&) {}
}

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

票数 39
EN

Stack Overflow用户

发布于 2010-12-09 03:47:42

值得注意的是,NDK附带了STLport和GNU STL,所以既然NDK C++编译器中有a) r5支持b)异常支持,那么这里的hack就不再是必要的了。

票数 3
EN

Stack Overflow用户

发布于 2011-02-14 20:46:35

特别是shared_ptr的另一种解决方法是改用boost::intrusive_ptr。这并不总是可行的,但对我的情况有效。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4347151

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档