4

我正在尝试构建一个使用 boost 序列化的 Android 应用程序。我已经使用 arm 4.7 的 g++ 构建了针对 NDK r8d 的库。但是,当我使用 ndk-build 将本机代码编译到库中时,当编译器尝试在 boost 中链接存档标头中的一些代码时,我得到“未定义的对 'mbtowc' 的引用”和“未定义的对 'wctomb' 的引用” .

关于 NDK 是否支持这些功能,我似乎无法得到明确的答案。

根据 Boost 邮件列表,虽然它实现了这些功能,但 CrystaX NDK 不是一个选项,因为它已知在与 Boost 一起使用时会崩溃。

那么,如果 NDK 确实以某种方式实现了这些功能,为什么 NDK-build 无法链接它们呢?我可以在 NDK 的 cstdlib 中找到对它们的引用,并且我相信可能需要设置一个标志,但我不确定如何或在哪里设置。

如果没有实现它们,是否有人对我如何自己编写它们有任何建议?我大致知道 mbtowc 及其补充应该做什么,但没有太多编写低级 C 的经验,也没有太多的 Android / ARM 架构知识,我真的可以使用一些建议。

4

3 回答 3

9
#ifdef ANDROID
int wctomb(char *s, wchar_t wc) { return wcrtomb(s,wc,NULL); }
int mbtowc(wchar_t *pwc, const char *s, size_t n) { return mbrtowc(pwc, s, n, NULL); }
#endif
于 2013-11-03T10:41:17.593 回答
1

发现!是的,boost 可以通过将预处理器定义添加到 boost 构建脚本来构建它而无需 wchar 支持。在我尝试将对象序列化到文件的代码行中使用它们构建时,Boost 仍然崩溃。(崩溃是 0x00000000 处的通用段错误,我无法获得任何有用的信息)。

所以,我没有费心写 wctomb 或它的逆。我不需要,是我问题的答案,尽管最终问题的答案并不重要。

进一步澄清:不要费心去做我一直想做的事情。如果你一直在使用 Boost 的序列化库,并希望你的代码在 android ndk r8d 或更早版本上运行,那就放弃吧。自己编写一个序列化程序,因为没有关于如何使序列化工作的有用信息。希望 ndk 的未来版本可以解决这个问题,但现在我别无选择,只能重写所有内容。

于 2013-04-10T14:27:09.817 回答
0

我有同样的问题。我正在为使用 boost::serialization 的代码创建一个 android 端口。

由于缺少mbtowc/ wctomb(mb: multi-byte (char), wc: (wide-char)' 的实现,我的代码无法编译

据我所知,这些函数的实现可能会很棘手,因为 android 的宽字符是单字节字符而不是真正的宽字符。

但是,当我编译 boost 时-DBOOST_NO_STD_WSTRING链接错误消失了,我可以在 android 上使用boost::archive::text_iarchive& 。boost::archive::text_oarchive

我现在可以毫无问题地序列化 STL 数字和 std::strings 容器。

我按照此链接上的建议为 android 编译了 boost:http: //www.codexperiments.com/android/2011/05/tips-tricks-building-boost-with-ndk-r5/

我正在使用 boost-1.55_0 和 NDK r9c。

<compileflags>-DBOOST_NO_STD_WSTRING在构建命令中添加了以下内容,这样它就可以构建没有宽字符支持的序列化库。

于 2014-05-12T17:26:38.063 回答