2012-12-26 85 views
43

這個問題是在延續​​問,官方「Boost library」支持Android和iOS?

Boost庫的目的是廣泛有用的,在廣泛的應用中使用,但尚未有Android和iOS

    沒有可用的官方支持
  1. 有沒有像 嵌入式設備未優化的背後有任何特定的原因?或者其他原因?
  2. 任何機構是否知道在Android或iOS上使用Boost構建的任何應用程序?
  3. 建議將boost庫用於產生多線程通信的網絡密集型應用程序嗎?

FYI..I已使用以下鏈接創建示例Android應用程序,但尚未成功:(

https://github.com/MysticTreeGames/Boost-for-Android

http://www.codexperiments.com/android/2011/05/tips-tricks-building-boost-with-ndk-r5/

Include Boost C++ library in android

How to use the boost library (including shared_ptr) with the Android NDK and STLport

https://sites.google.com/site/fourdollars/android/android-mk

https://groups.google.com/forum/?fromgroups=#!topic/android-ndk/4lxhsKFe7Ho

http://www.crystax.net/trac/ndk/ticket/6

Android NDK R5 and support of C++ exception

在此先感謝。

+0

從技術上說,你會希望官方支持這些平臺而不是_ports_。 –

+0

是智能手機應用程序開發的明智之舉嗎? – RDX

+3

FWIW,我成功地爲iOS和Android構建了我的應用程序(相當廣泛地使用boost)。我認爲缺乏「官方」支持的主要原因是沒有人自願爲這些平臺運行發佈測試。 –

回答

23

得到了助推社區的回覆 是的。這些平臺並未得到正式支持,因爲沒有人自願爲他們定期進行迴歸測試。

Boost開發人員無法在所有平臺上進行測試。因此 開發人員依賴於 志願者運行的迴歸測試的測試結果。例如,請參閱 http://beta.boost.org/development/tests/trunk/developer/summary.html

如果沒有人自願爲特定平臺運行測試,則該平臺不受官方支持。

因此,如果您關心的是Android或iOS正式支持, 開始運行定期(最好每日)的Boost迴歸測試。 見http://beta.boost.org/development/running_regression_tests.html

+3

我很高興通過運行夜間迴歸測試來使用我的一些工作硬件。問題是編譯是跨平臺的,對於製作應用程序有特殊要求(你不能在這些平臺上製作控制檯應用程序),並且測試需要在外部設備/模擬器/仿真器上運行。就我所知,現有的測試套件沒有配備。然而,我會願意與更熟悉升壓測試的人合作,努力實現這一目標。我的名字(at)brainiumstudios.com – Brent

+3

CrystaX https://www.crystax.net/項目自3月15日以來推出了針對Android的定期迴歸測試 http://www.boost.org/development/tests/master/developer /summary.html http://habrahabr.ru/post/253233/(rus) –

11

UPDATE:似乎有要與標準::原子在Android上的問題,而且由於Boost.Asio的是使用它(默認情況下),結合線程,一個偶然得到了僵持。幸運的是,Boost.Asio可以很容易地從Std.Atomic轉換到Boost.Atomic,項目this commit已經完成了這項工作。

有關錯誤的詳細信息,請參閱here


我們使用升壓ASIO,到目前爲止,我們沒有任何問題,開發Android簡單的多人遊戲(尚未公佈)。這是針對問題#2的。

你看到了什麼樣的問題?

如果問題與編譯和鏈接有關,也許這些提示將證明是有用的。

添加以下AndroidManifest.xml檔案:

<uses-permission android:name="android.permission.INTERNET"></uses-permission> 

有這個在您的Application.mk文件:

APP_STL := gnustl_static 
APP_CPPFLAGS += -frtti -fexceptions 

,並以此作爲模板,爲您的Android.mk文件:

LOCAL_PATH := $(call my-dir) 
BOOST_VERSION  := 1_49 
PROJECT_ROOT  := $(LOCAL_PATH)/../../../.. 
BOOST_INCLUDE_PATH := /path/to/boost/headers 
BOOST_LIB_PATH  := /path/to/boost/libraries 

# Path and name of the STL library. Add this to the *end* of LOCAL_LDLIBS. 
# Note this is a hack/workaround to prevent linker errors when compiling with 
# boost. 
STL_LIBS := -L$(NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/libs/armeabi \ 
        -lgnustl_static 

include $(CLEAR_VARS) 

LOCAL_MODULE := native-activity 
LOCAL_C_INCLUDES:= $(BOOST_INCLUDE_PATH) \ 
        $(PROJECT_ROOT)/src \ 
        $(PROJECT_ROOT)/platform/android/jni 

LOCAL_SRC_FILES := main.cpp 
LOCAL_LDLIBS := -llog -landroid 

# The order of these libraries is often important. 
LOCAL_LDLIBS += -L$(BOOST_LIB_PATH)  \ 
       -lboost_system-gcc-mt-$(BOOST_VERSION) \ 
       -lboost_thread-gcc-mt-$(BOOST_VERSION) \ 
       $(STL_LIBS) 

LOCAL_STATIC_LIBRARIES := android_native_app_glue 

include $(BUILD_SHARED_LIBRARY) 
$(call import-module,android/native_app_glue) 

編輯:我們如何爲Android構建提升。這是我們在我們的Makefile:

git clone git://github.com/madadam/Boost-for-Android.git 
./build-android.sh --boost=1.49.0 --with-libraries=chrono,program_options,system,thread /path/to/ndk 

注意,我們使用的是我們自己的升壓換安卓的前叉,這僅僅是因爲一個擁有最新版本NDK一個R 8d中的補丁。從命令行也可以看出,我們正在使用1.49版本的boost,這是目前最高支持的Boost-for-Android。

如果您想知道Boost和Android NDK支持哪些組合,請查看Boost-for-Android項目。它包含目錄稱爲補丁/助推< X>/NDK-的Android < Ÿ>其中X對應於支持增強版和ÿ的支持NDK版本(無恥插頭:我們2美分至項目:-))。

+0

哪些網絡和多線程支持需要增強庫? – RDX

+0

添加這三個庫:-lboost_system-gcc-mt- ,-lboost_thread-gcc-mt- 和-lgnustl_static(按此順序)。這應該做到這一點。讓我們看看您看到的確切錯誤,如果沒有它,很難猜測如何提供幫助。有助於我們的其他信息:NDK版本,您正在開發的平臺以及您是否使用eclipse或ant + makefiles。 –

+0

謝謝彼得。分析您的回覆後解決問題。一個query.how你是否遵守了android的提升?而且你使用boost 1_52 – RDX

14

看看我的github上的跨平臺教程。它向您展示瞭如何設置Boost並在iOS和Android之間使用它。我有這樣可怕的時間,我想我會記錄下來,所以沒有其他人必須弄清楚。您會注意到,該項目還引入了兩個平臺之間使用的其他幾個常用項目,例如CoreFoundation和SQLite。

https://github.com/markshiz/cross-platform-tutorial

注:我的教程並不說明如何構建編譯庫的提振。我這樣做,是之前成功使用你提供的說明:

http://www.codexperiments.com/android/2011/05/tips-tricks-building-boost-with-ndk-r5/

之後,你有被Android工具鏈編譯靜態庫,你可以很容易地在通過類似於include/[NAME OF NEW SUBMODULE]目錄下生成一個模塊鏈接上面的項目。對該目錄的根目錄中的Android.mk文件使用類似於以下內容的內容。

include $(CLEAR_VARS) 
LOCAL_MODULE:= boost_regex 
LOCAL_SRC_FILES:= ./path/to/built/static/library/libboost_regex-gcc-mt-s.a 
LOCAL_EXPORT_C_INCLUDES := ./path/to/the/directory/that/has/the/boost/headers 
include $(PREBUILT_STATIC_LIBRARY) 

最後,導入模塊,在本例中,內

$(call import-module,[NAME OF NEW SUBMODULE]) 

至於你的其他問題--do你知道,在iOS和Android使用加速的應用程序?是的,我成功地多次完成了它,並將工作應用發佈到App Store。

您的其他問題,建議使用boost來進行網絡通信嗎?我不確定你在這裏的意思。從什麼角度?你的意思是,哲學上,技術上等?

在哲學上,你必須問自己,你有什麼理由導入這個庫並在Android和iOS之間使用它。是否節省代碼時間,維護負擔。如果是這樣,我會說這是一個很好的方法來做到這一點。很明顯,要讓這種設置起作用有一些障礙和痛苦。另外,用於C++的IDE功能並不像Eclipse中的Java那麼棒。我試圖在doc/目錄中的PDF演示文稿中保持公平和均衡。給那一次一次。

從技術角度來看,我認爲我唯一擔心的就是確保在活動停止時正確清理Asio對象。如果你需要做的事情的背景下,改爲使用服務:

http://developer.android.com/reference/android/app/Service.html

+0

感謝markshiz – RDX

9

以下是提升社區收到一些(非常有用)的信息:

  1. 有背後的任何特定原因(如未針對 嵌入式設備進行優化)?或者其他原因?

Boost在Android上完美工作。由於有一個非常像樣的gcc(本地開發工具包) ,你只需要配置boost build 來使用正確的gcc。雖然這一切都有效,但它需要一點點修改才能正確設置設置。但是,原則上,在構建用於Android或任何其他Linux 發行版的Boost中不存在很多差異。

  • 是否有(全部),如果我們使用升壓庫 網絡和線程同步的智能手機應用程序開發 任何已知問題?同樣使用BOOST ASIO會是一個好主意嗎?
  • 使用Boost.Thread或Boost.Asio是完全正確的。它們在ARM設備上工作得很好 。甚至還支持更多平臺特定的hackeries ,比如boost.atomic和boost.context。

    FYI是鏈接發現 https://github.com/MysticTreeGames/Boost-for-Android http://www.codexperiments.com/android/2011/05/tips-tricks-building-boost-with-ndk-r5/

    建設提升與Android NDK是不是直接boost.build 更簡單。我編譯了一堆Android編譯腳本,可以在這裏找到 : https://github.com/STEllAR-GROUP/HPXAndroid/tree/master/modules 查找各種boost庫的boost _ $ {module}。這不是一個 完整列表。只有我需要。此外,可能需要1.53的一些愛。 所有不同庫並不需要任何特殊的Android治療(模 一些小錯誤在編譯器不與其他版本的GCC同意)

    我希望這將是爲別人有用的! 謝謝!

    +0

    官方支持需要志願者測試人員,以便維護人員可以修復 問題。 如果您有辦法,請定期進行迴歸測試。 – RDX