2012-12-26 12 views
43

Questa domanda è in proseguimento per Should I choose Boost Asio or Aysnc Socket threads in Android? chiesto,Supporto "Boost library" ufficiale per Android e iOS?

librerie Boost sono destinati ad essere ampiamente utile, ed utilizzabili in una vasta gamma di applicazioni, ma ancora non v'è alcun supporto ufficiale disponibile per Android e iOS

  1. C'è qualche motivo specifico dietro lo stesso come Non ottimizzato per i dispositivi incorporati ? O qualche altra ragione?
  2. Qualcuno sa di un'applicazione creata con Boost su Android o iOS?
  3. È consigliabile utilizzare le librerie boost per un'applicazione intensa di rete che genera più thread per la comunicazione?

FYI..I hanno utilizzato seguenti link per creare un'applicazione Android campione, ma non è successo ancora :(

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

Grazie in anticipo.

+0

Tecnicamente vorresti un supporto ufficiale per quelle piattaforme invece di _ports_. –

+0

è consigliato per lo sviluppo di applicazioni per smartphone? – RDX

+3

FWIW, ho creato con successo la mia applicazione (che utilizza boost in modo piuttosto esteso) sia per iOS che per Android. Credo che il motivo principale per la mancanza di supporto "ufficiale" sia il fatto che nessuno si è offerto volontario per eseguire test di rilascio per questa piattaforma. –

risposta

23

Ottenuto risposta da boost community Sì. Queste piattaforme non sono ufficialmente supportate perché nessuno ha volontario per eseguire regolarmente i test di regressione per loro.

Non è possibile testare su tutte le piattaforme uno sviluppatore Boost. Quindi gli sviluppatori dipendono dai risultati del test dei test di regressione eseguiti dai volontari . Ad esempio, vedere http://beta.boost.org/development/tests/trunk/developer/summary.html

Se non volontari uno per eseguire i test per una particolare piattaforma, che la piattaforma non è ufficialmente supportato.

Quindi, se ti interessa Android o iOS ufficialmente supportati, inizia a eseguire test di regressione regolari (preferibilmente giornalieri) per Boost. Vedere http://beta.boost.org/development/running_regression_tests.html

+3

Sarei felice di utilizzare un po 'dell'hardware del mio lavoro eseguendo test di regressione notturna. Il problema è che la compilazione è multipiattaforma, ha requisiti specifici per creare applicazioni (non puoi semplicemente creare un'applicazione console su queste piattaforme) e i test devono essere eseguiti su un dispositivo/simulatore/emulatore esterno. La suite di test esistente non è attrezzata per questo, per quanto ne so. Tuttavia, sarei disposto a lavorare con qualcuno, più familiarizzato con i test di boost di me, verso questo sforzo. Il mio nome (at) brainiumstudios.com – Brent

+3

CrystaX https://www.crystax.net/ progetto ha lanciato test di regressione regolari per Android dal 15 marzo http://www.boost.org/development/tests/master/developer /summary.html http://habrahabr.ru/post/253233/ (rus) –

11

UPDATE: Sembra che ci sia un problema con std :: atomica su Android, e dal momento che Boost.Asio sta usando (per impostazione predefinita), in combinazione con fili, uno di tanto in tanto ma ho un punto morto. Fortunatamente Boost.Asio rende facile passare da Std.Atomic a Boost.Atomic e questo è stato risolto nel progetto Boost-for-Android in this commit.

Per ulteriori informazioni sul bug, vedere here


Stiamo sviluppando un semplice gioco multiplayer (non ancora rilasciato) per Android utilizzando spinta ASIO e finora non abbiamo avuto alcun problema. Questo è per la domanda n. 2.

Che tipo di problemi vedi?

Se i problemi sono legati alla compilazione e al collegamento, forse questi suggerimenti si riveleranno utili.

Add segue al file AndroidManifest.xml:

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

avere questo nel file Application.mk:

APP_STL := gnustl_static 
APP_CPPFLAGS += -frtti -fexceptions 

e utilizzare questo come un modello per il file 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) 

MODIFICA: Come si genera boost per Android. Questo è ciò che abbiamo nel nostro 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 

Si noti che stiamo usando la nostra forchetta di Boost-per-Android, questo è solo perché che si ha una patch per la versione più recente NDK r8d. Si può anche vedere dalla riga di comando che stiamo usando la versione 1.49 di boost, questo è attualmente il più alto supportato da Boost-per-Android.

Se si desidera sapere quali combinazioni di Boost e NDK Android sono supportate, dare un'occhiata all'interno del progetto Boost-per-Android. Esso contiene le directory denominati patch/Boost- < X>/NDK Android-< Y> dove X corrisponde alla versione spinta sostenuto e Y alla versione NDK supportata (spudorato: i nostri 2 centesimi al progetto :-)).

+0

quali librerie di aumento sarebbero necessarie per il supporto di rete e multithreading? – RDX

+0

Aggiungi queste tre librerie: -lboost_system-gcc-mt- , -lboost_thread-gcc-mt- e -lgnustl_static (in questo ordine). Questo dovrebbe farlo. Vediamo l'errore esatto che stai vedendo, è difficile indovinare come aiutare senza di esso.Informazioni aggiuntive che potrebbero aiutarci: versione NDK, piattaforma su cui stai sviluppando e se stai utilizzando eclipse o ant + makefile. –

+0

Grazie Peter. Risolti i problemi dopo aver analizzato la tua risposta. Una query.how hai rispettato il boost su Android? E usando boost 1_52 – RDX

14

Guarda il mio tutorial multipiattaforma su github. Ti mostra come configurare Boost e usarlo tra iOS e Android. Ho avuto un momento così orribile con questo, immagino che avrei documentato così nessun altro ha dovuto capirlo. Noterai che questo progetto richiama anche molti altri elementi comuni usati tra le due piattaforme, ad es. CoreFoundation e SQLite.

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

Nota: il mio tutorial non mostra come costruire le librerie compilate per spinta. Ho fatto prima con successo utilizzando le istruzioni che hai fornito:

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

Dopo avere una libreria statica compilato dal toolchain di Android, si può facilmente collegare in tramite un modulo simile a quelli sotto la directory include/[NAME OF NEW SUBMODULE] del progetto di cui sopra. Utilizzare qualcosa di simile al seguente per il file Android.mk nella directory principale di tale directory.

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) 

Infine, importare tale modulo, come nell'esempio, all'interno

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

Per quanto riguarda le vostre altre domande --Lo siete a conoscenza di un'applicazione che utilizza Boost su iOS e Android? Sì, l'ho fatto più volte con successo e ho rilasciato app di lavoro agli App Store.

Un'altra domanda, è consigliabile utilizzare Boost per la comunicazione di rete? Non sono sicuro di cosa intendi qui. Da quale angolo? Intendi filosoficamente, tecnicamente, ecc.?

Filosoficamente, devi chiedertelo, qual è il tuo ragionamento per importare questa libreria e utilizzarla tra Android e iOS. È per risparmiare tempo di codice, oneri di manutenzione. Se è così, direi che questo è un modo eccellente per farlo. Chiaramente ci sono alcuni ostacoli e dolori nel far funzionare questo tipo di set up. Inoltre, le funzionalità IDE per C++ non sono fantastiche come per Java in Eclipse. Cerco di essere equo ed equilibrato nella presentazione PDF nella directory doc/. Dacci una volta.

Dal punto di vista tecnico, penso che l'unica cosa di cui mi preoccuperei è assicurarsi di pulire gli oggetti Asio correttamente quando l'attività viene interrotta. Se avete bisogno di fare le cose in background, utilizzare un servizio al posto:

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

+0

Grazie markshiz – RDX

9

Qui di seguito ci sono alcuni più (molto utile) le informazioni ricevute dalla comunità di spinta:

  1. C'è qualche motivo specifico dietro lo stesso (come non ottimizzato per i dispositivi incorporati )? O qualche altra ragione?

Boost funziona perfettamente su Android. Poiché esiste un NDK (kit di sviluppo nativo) con un gcc abbastanza decente (4.6 qualcosa), è sufficiente configurare boost build per utilizzare il codice gcc corretto. Anche se tutto funziona, richiede un po 'di armeggiare per ottenere le impostazioni giuste. Ma di nuovo, in linea di principio, non c'è una differenza di nella creazione di Boost per Android o di qualsiasi altra distribuzione di Linux .

  1. Ci sono (a tutti) eventuali problemi noti se usiamo le librerie Boost per networking e la sincronizzazione dei thread per Smartphone applicazione sviluppo? Sarà una buona idea usare BOOST ASIO per lo stesso?

E 'perfettamente bene usare Boost.Thread o Boost.Asio. Funzionano perfettamente bene su dispositivi ARM. C'è anche il supporto per gli hacker più specifici della piattaforma come boost.atomic e boost.context.

FYI sono i link trovati https://github.com/MysticTreeGames/Boost-for-Android http://www.codexperiments.com/android/2011/05/tips-tricks-building-boost-with-ndk-r5/

spinta Costruire con l'NDK Android è ancora più semplice che con boost.build direttamente. Ho compilato una serie di script di build Android, che possono essere trovati qui: https://github.com/STEllAR-GROUP/HPXAndroid/tree/master/modules Cerca l'amplificazione _ $ {module} per varie librerie di boost. Questo non è un elenco completo . Solo quello di cui avevo bisogno. Inoltre, potrebbe essere necessario un po 'di amore per 1.53. Tutte le diverse biblioteche non hanno bisogno di alcun trattamento speciale Android (modulo alcuni bug minori in cui il compilatore non era d'accordo con le altre versioni di gcc)

Spero che questo sarebbe utile anche per gli altri! Grazie!

+0

Il supporto ufficiale necessita di un tester volontario, in modo che i manutentori possano risolvere i problemi . Se si dispone dei mezzi, eseguire regolarmente il test di regressione. – RDX