58

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

原料:

提升 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

4 回答 4

39

事实证明,这种方法在编译可调试库时并不完全有效。发布库是用 -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",它也会编译并链接到应用程序。它不在模拟器中运行,但在我包含这个库之前它也没有这样做。

于 2010-12-06T16:41:16.737 回答
3

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

于 2010-12-08T19:47:41.757 回答
1

特别是 shared_ptr 的另一个解决方法是使用 boost::intrusive_ptr 。这并不总是可能的,但适用于我的情况。

于 2011-02-14T12:46:35.193 回答
1

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

于 2013-10-23T14:33:28.190 回答