如何为android实现mbtowc? (或者,理想情况下,如何不?)

时间:2013-03-18 14:23:22

标签: android c boost android-ndk arm

我正在尝试构建一个使用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架构没有太多了解,我真的可以使用一些建议。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

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

所以,我没有打扰写wctomb或它的逆。我不应该,是我的问题的答案,虽然最后问题的答案无关紧要。

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

答案 2 :(得分:0)

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

由于缺少mbtowc / wctomb(mb:多字节(字符),wc:(wide-char)'

的实现,我的代码无法编译

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

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

我现在正在序列化数字和std ::字符串的STL容器而没有问题。

我根据此链接上的建议编译了针对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,因此它将构建没有广泛字符支持的序列化库。

相关问题