2013-03-18 56 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到構建命令,這樣它將建造序列化庫不寬字符支持。

相關問題