- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
这更像是一个答案而不是一个问题,因为我已经弄清楚了,至少就干净地编译库而言。我的主要问题是让 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/
我浏览了很多关于 Android NDK 和 STLport 的资料。我有复杂的应用程序,java+ native 代码,它加载 STLport(一个 c++ 标准库端口)。原始代码库在项目“jni”
STLPort 是否通过引用计数机制实现字符串? 最佳答案 According to the source, no. 关于c++ - STLPort 的字符串实现是否使用引用计数?,我们在Stack
我正在用 C++ 开发一个内核。但是我不想写一个stdlib;为此,我下载了 STLport http://www.stlport.org/ , 但我不知道如何安装和使用它。 我正在使用 Linux
我试图在我的项目中使用 STLPort,当我按照 INSTALL.unixes 中的说明进行操作时,我遇到了编译错误。 我运行了./configure,然后是make,输出如下。我在 Ubuntu 上
我看到有人在 Visual C++ 中使用 STLport,但我认为标准 C++ 库已经包含在 Visual C++ 中了?使用 STLport 有什么好处? STLport 是免费的吗? 最佳答案
我正在尝试使用 android NDK rev8b 编译原生库(源自 WebRTC)。我收到以下错误: android_ndk/android-ndk-r8b/toolchains/arm-linux
我正在尝试使用 froyo 源中的 STLport 版本做一些工作。我得到了 stlport/stlport/stl/_alloc.h:158: undefined reference to `st
我正在使用 MSVC 7.1 在 Windows 上使用 STLport 5.2.1 构建 boost 1.48.0,这是我运行的命令行: b2 toolset=msvc link=shared th
是否可以在托管 C++ DLL 中使用 STLport? 在我的项目中,我从 STLport 内容的链接器中收到了几个“ Unresolved token ”错误。例如。: 1>moc_ParentW
根据 STLPort 编译我的项目时出现一些奇怪的构建错误。很奇怪,因为项目运行得很好(而且快 20-30%),尽管您认为构建错误是致命的。 谁能告诉我我做错了什么以及如何闭嘴? Linking...
我在 Windows 下的性能关键 C++ 代码中使用了相当多的 STL。获得一些额外性能的一种可能的“廉价”方法是更改为更快的 STL 库。 据此post STLport 速度更快,使用的内存更
我尝试编译基本示例: #include int main () { std::vector testV; for (const auto& test : testV) {
我正在尝试将我的办公室代码从 C++ 迁移到 C++11,我们大量使用 STLPorts。 有一个编译器宏 (http://www.stlport.org/doc/configure.html) -
当我在 Darwin 上运行 STLport 时,我遇到了一个奇怪的崩溃。 (除了在 Mac 上没有在其他任何地方看到它,但是在 i686 和 PowerPC 上完全相同的东西崩溃了。)这就是它在 g
我们编写了一个智能指针类,并在内置的 Visual Studio STL 实现中使用它并取得了巨大成功。 问题是我们已经意识到我们的性能瓶颈在从 Linux 移植的代码中的 STL 库中(STL 比我
最近,我被以下问题困扰STL std::string class causes crashes and memory corruption on multi-processor machines在使用
我正在尝试为 Android 构建 STLport。我执行了以下步骤,但它们不起作用: 1 - 使用以下方法克隆 STLport 存储库: git clone git://STLport.git.so
我正在尝试在 Snow Leopard 下构建最新版本的 STLprot。 编译步骤: ./configure sudo make && make check make && make check 工
我使用的是 Android 2.2,它带有一个 STLport 版本。由于某种原因,它被配置为非线程安全的。这是在配置头文件中使用#define _NOTHREADS 完成的。 当我从不同的 pthr
我正在使用 Android NDK,由于它目前不支持 STL,我想知道是否有任何优秀的人在这方面取得了成功,或者知道哪个更适合 Android 平台:uSTL 或STL端口。 编辑: 看起来另一个选项
我是一名优秀的程序员,十分优秀!