Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何与Android NDK和STLport一起使用boost库(包括shared_ptr)_C++_Boost_Android Ndk_Stlport - Fatal编程技术网

C++ 如何与Android NDK和STLport一起使用boost库(包括shared_ptr)

C++ 如何与Android NDK和STLport一起使用boost库(包括shared_ptr),c++,boost,android-ndk,stlport,C++,Boost,Android Ndk,Stlport,这与其说是一个问题,不如说是一个答案,因为我已经找到了答案,至少就干净地编译库而言。对我来说,主要的问题是让共享的ptr工作 成分: 助推。1.45.0 STLport的版本位于 NDK的r4b版本 说明: 在Android.mk文件中添加: LOCAL_CFLAGS += -DBOOST_EXCEPTION_DISABLE -D_STLP_NO_EXCEPTIONS -DOS_ANDROID -D_STLP_USE_SIMPLE_NODE_ALLOC 删除对stlport/stl/_stri

这与其说是一个问题,不如说是一个答案,因为我已经找到了答案,至少就干净地编译库而言。对我来说,主要的问题是让共享的ptr工作

成分:

助推。1.45.0

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行的uu stl_throw_length_error的调用。如果愿意,可以使用_STLP_NO_EXCEPTIONS

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

接下来,您需要提供一些缺失的部件。创建具有以下内容的头文件:

#ifdef OS_ANDROID

#include <exception>

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

#endif
#ifdef OS#u ANDROID
#包括
名称空间标准
{
结构bad_alloc:public异常{bad_alloc operator()(){};
}
#恩迪夫
以及一个源文件,其中包含一个精简的异常类以支持错误的分配:

#ifdef OS_ANDROID

#include <exception>

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

#endif
#ifdef OS#u ANDROID
#包括
名称空间标准
{
异常::异常(){}
异常::~exception(){}
常量字符*异常::什么()常量{}
}
#恩迪夫

在包含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”,它也会编译并链接到应用程序中。它不会在模拟器中运行,但在我加入这个库之前它也不会运行 < P>特别是使用Boosi::这并不总是可能的,但对我的情况有效。

当前版本的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二进制文件中使用。它仍然标记为experimantal,但您可以将其与clang和gcc一起使用


请参见

为了避免这个问题永远公开,如果你能将这篇文章重新表述为一个问题,然后按照作者的建议自己回答,那将是非常酷的。谢谢分享你所学到的!我相信这对很多人都有帮助。Dennycrane,我还在尝试这种方法,所以我想让它保持开放,以防有更多的补充。当我得到一个运行良好的库时,我会报告这一点,并以一个答案结束问题。我同意@dennycrane关于未来更好的方面的观点,但更重要的是,你花时间以任何形式发布了这本有用的指南。我已经发现它很有用,我甚至没有机会读它;简单地知道这是可能的将极大地帮助我设计我目前的项目。感谢您为我和其他许多人节省了时间,让我能够以与您相同的方式找到答案,而没有任何问题提示您。您的a点和b点单独正确,但不能组合使用(请参阅nkd文档中CPLUSPLUS-SUPPORT.html第三节中的警告)。因此,您仍然需要std::bad_alloc,std::bad_cast和boost::throw_异常黑客我讨论过。这很奇怪。我上面引用的文档根本没有提到GNU STL,只是说“完整的GNU libstdc++支持”是未来的计划。但在NDK中,它位于sources/cxx stl及其最小系统和stlport下。你设法让它工作了吗?我注意到关于这个问题的讨论正在进行中。它似乎是在NDK页面上提到的,而不是在文档中提到的。引用“提供一个默认的C++ STL实现(基于STLPART)作为辅助模块。它可以作为静态或共享库使用(详细信息和使用示例在源代码/ Android /STLPORT/ReMe]中。预构建二进制文件用于STLport(静态或共享)和GNU LIbSTDC++ +(仅静态)”。看起来libstdc++可以处理异常和RTTI。我可以用它编译,但是库链接阶段很糟糕,有很多未定义的引用错误。我尝试了一个显式的LOCAL_LDLIBS+=-lstdc++但是没有帮助。你让APP_STL:=gnustl_static工作了吗?是的,它对我有用(tm)。我不需要为STL显式添加ld参数;对于我构建和使用的所有其他库,但不是STL本身。您可以使用std::vector或类似工具与hello world进行验证。我给了您尽可能多的向上投票。花了整整一天的时间来弄清楚这一点,发现这非常有帮助。既然你已经按照上面的建议回答了自己的问题,你应该再投一票。我希望更多的人(不幸的是,包括我自己)考虑在没有其他人要求的情况下将他们难以找到的解决方案发布到这里。你也可以很容易地从shared_ptr_nmt.hpp中提取shared_ptr,这是一个简化版本。