2013-03-18 58 views
4

我正在尝试构建一个使用boost序列化的Android应用程序。我已经使用arm 4.7的g ++构建了针对NDK r8d的库。然而,当我使用ndk-build编译我的本地代码到一个库中时,当编译器试图链接boost库中的一些代码时,我得到了“未定义的引用''mbtowc''和'未定义的引用''wctomb' 。如何实现android的mbtowc? (或者,理想情况下,如何不?)

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

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

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

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

+0

一个极其垃圾的办法是打电话回Java。另一个将链接到'libiconv'.It可能值得挖掘Android源代码并查看Java本身使用的库。从头开始重新实现代码页转换不是偶然的事情。 – 2013-03-18 16:28:13

+0

您可以简单地通过NDK标头grep来检查功能可用性。我很好奇你对CrystaX NDK和Boost的看法?我们已经使用了很多年了。 – NuSkooler 2013-03-19 20:57:26

+0

你有没有使用序列化库?这就是我需要的,这需要默认情况下支持wchar的Android不存在。不幸的是,有太多这样的变量来明确说明哪些库可以在不同的平台上工作,或者使boost的兼容性全有或全无。 看来有将配置提升打造与wchars不支持在目标平台上的假设预处理器定义。我遇到了其他试图测试该方法的问题。我会在发布时发布我的发现。 – 2013-04-05 20:02:38

回答

1

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

所以,我没有写过wctomb或其反面。我不需要,是我的问题的答案,尽管最终问题的答案并不重要。

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

8
#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 
0

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

我的代码失败,因为mbtowc/wctomb(MB失踪执行编译:多字节(字符),WC:(宽字符)”

这些功能的实现可能会非常棘手,原因就因为我知道宽字符为Android是一个单字节字符,而不是一个真正的宽字符..

然而,当我编译加强与-DBOOST_NO_STD_WSTRING的链接错误消失了,我可以在Android上使用boost::archive::text_iarchive & boost::archive::text_oarchive

我现在序列化数值和std ::字符串的STL容器没有问题。下面这个链接的建议

我编译提升为Android:http://www.codexperiments.com/android/2011/05/tips-tricks-building-boost-with-ndk-r5/

我使用升压1.55_0和NDK R9C。

添加以下<compileflags>-DBOOST_NO_STD_WSTRING到构建命令,这样它将建造序列化库不宽字符支持。

相关问题