gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 13:23:23 27 4
gpt4 key购买 nike

这更像是一个答案而不是一个问题,因为我已经弄清楚了,至少就干净地编译库而言。我的主要问题是让 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 的任何地方都包含标题。编译源代码并将其添加到您的库中。

最佳答案

事实证明,这种方法在编译可调试库时并不完全有效。发布库是用 -O2 编译的,它优化了一些不合理的地方,但调试库是用 -O0 完成的,它揭示了一些额外的问题。此外,我对不得不编辑 boost 文件不太满意。因此,通过一些额外的研究,我提出了以下解决方案。

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

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

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

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

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

关于c++ - 如何在 Android NDK 和 STLport 中使用 boost 库(包括 shared_ptr),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4347151/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com