Gam*_*nis 57 c++ boost stlport android-ndk
这更像是一个答案,而不是一个问题,因为我已经弄明白了,至少就干净地编译图书馆而言.对我来说,主要问题是让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
Run Code Online (Sandbox Code Playgroud)
在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
Run Code Online (Sandbox Code Playgroud)
和一个带有精简异常类的源文件,以支持bad_alloc:
#ifdef OS_ANDROID
#include <exception>
namespace std
{
exception::exception() {}
exception::~exception() {}
const char* exception::what() const {}
}
#endif
Run Code Online (Sandbox Code Playgroud)
在包含boost/shared_ptr.hpp的任何地方都包含标题.编译源代码并将其添加到库中.
Gam*_*nis 39
事实证明,在编译可调试库时,这种方法并不完全有效.发布库使用-O2编译,这可以优化一些不足,但调试库使用-O0完成,这会显示一些其他问题.此外,我不太高兴不得不编辑boost文件.因此,通过一些额外的研究,我提出了以下解决方案.
首先,不要编辑任何增强文件.而是将以下内容添加到std命名空间中的标头:
struct bad_cast : public exception {bad_cast operator()(){}};
Run Code Online (Sandbox Code Playgroud)
接下来将以下内容添加到源文件中:
namespace boost
{
void throw_exception(std::exception const&) {}
}
Run Code Online (Sandbox Code Playgroud)
现在,即使AndroidManifest.xml中的android:debuggable ="true",这也会编译并链接到应用程序中.它不在模拟器中运行,但在我包含此库之前它没有这样做.
归档时间: |
|
查看次数: |
15667 次 |
最近记录: |