uSTL o STLPort per Android?
-
22-07-2019 - |
Domanda
Sto lavorando con Android NDK e poiché al momento non supporta STL, mi chiedevo se ci sono persone brillanti là fuori che hanno avuto successo con questo, o sanno quale sia più adatto per la piattaforma Android : uSTL o STLPort.
EDIT: Sembra che un'altra opzione potrebbe essere CrystaX .NET .
Dal loro sito Web:
... distribuzione personalizzata di Android NDK r3 da cui ho ricostruito fonti ufficiali. Supporto di C ++ eccezioni, RTTI e C ++ standard Libreria aggiunta.
Soluzione
STLport supportato da Android2.3 ora !!!
Altri suggerimenti
Le porte di STL sono ufficialmente disponibili in Android NDK dalla versione r5 in poi. Può essere utilizzato come libreria statica o condivisa. Le seguenti implementazioni sono disponibili precompilate con NDK:
- STLport , basato su v5.2.0:
-
statico stlport_static
: utilizzare se nel progetto è presente una sola libreria dinamica. -
dinamico stlport_shared
: da utilizzare se nel progetto è presente più di una libreria dinamica.
-
- GNU libstdc ++
system
(libreria statica)
Il modo semplice e consigliato per usarlo in fase di compilazione è definire APP_STL in Application.mk, in questo modo:
APP_STL := stlport_static
E se vuoi ricostruirlo (questo è non necessario), definisci STLPORT_FORCE_REBUILD in Application.mk:
STLPORT_FORCE_REBUILD := true
È disponibile anche il framework di unit test per STLport.
Limitazioni attuali per STLport :
- Eccezioni C ++ non supportate
- RTTI non supportato
- " Probabili bug " a supporto di
wchar_t
e locali
Vari collegamenti:
La documentazione è disponibile nei pacchetti NDK nelle seguenti posizioni (potrebbero essercene di più):
- docsCPLUSPLUS-support.html
- fonti / CXX-stl / STLport
- fonti / CXX-stl / gnu-libstdc ++
Scarica i documenti NDK + qui ; bug di file qui
Di seguito è riportato un estratto da docs / CPLUSPLUS-SUPPORT.html (dai documenti NDK, r5)
III. Selezione dell'implementazione della libreria standard C ++:
Per impostazione predefinita, le intestazioni e le librerie per il sistema di runtime C ++ minimo libreria (/system/lib/libstdc++.so) sono usati quando si creano sorgenti C ++.
Puoi comunque selezionare un'implementazione diversa impostando la variabile APP_STL a qualcos'altro nella tua Application.mk, ad esempio:
APP_STL: = stlport_static
Per selezionare l'implementazione STLport statica fornita con questo NDK. Valore I valori APP_STL sono i seguenti:
sistema - > Utilizzare la libreria di runtime minima C ++ predefinita. stlport_static - > Utilizzare STLport creato come libreria statica. stlport_shared - > Utilizzare STLport creato come libreria condivisa.
ATTENZIONE: IMPORTANTE CAVEAT
AT THE MOMENT, OUR STLPORT IMPLEMENTATION DOES NOT SUPPORT EXCEPTIONS
AND RTTI. PLEASE BE SURE TO NOT USE -fexceptions OR -frtti IN ALL
MODULES THAT USE IT.
ATTENZIONE: FINE DI IMPORTANTE CAVEAT
" stlport_shared " è preferito se hai diverse librerie condivise nel tuo progetto che utilizza C ++ STL, perché evita la duplicazione delle funzioni e ancora più importante delle variabili globali (ad es. std :: cout) in ognuna di loro, che possono avere risultati sorprendenti.
D'altra parte, dovrai caricarlo esplicitamente all'avvio di applicazione, come nell'esempio seguente:
static {
System.loadLibrary("stlport_shared");
System.loadLibrary("foo");
System.loadLibrary("bar");
}
Dove entrambi " libfoo.so " e " libbar.so " dipende da " libstlport_shared.so " ;.
Nota che il nome della libreria condivisa se " libstlport_shared.so " evitare la denominazione è in conflitto con alcune immagini di sistema Android che includono a libstlport.so a livello di sistema (che risulta non essere ABI-stabile e non può essere utilizzato dal codice macchina generato da NDK).
" stlport_static " è preferito se hai solo una libreria condivisa nel tuo progetto: saranno solo le funzioni e le variabili STL effettivamente necessarie collegato al codice della macchina, riducendone le dimensioni e non sarà necessario per caricare stlport_shared dinamico all'avvio.
IV. Problemi specifici di STLport:
Questo NDK fornisce librerie statiche e condivise predefinite per STLport, ma puoi forzare la ricostruzione da fonti definendo quanto segue nel tuo ambiente o in Application.mk prima di creare:
<*>STLport è concesso in licenza sotto
Nota che uSTL si discosta un po 'dallo standard. Ad esempio, presuppone la codifica UTF-8 per std :: string. Sembra ancora interessante, però ...
Di recente mi sono imbattuto in alcuni script di supporto e una porta di STLport per Android , di John Ripley.
Esiste anche un post sul blog con le istruzioni su come configurarlo .
Suppongo che potrebbe rendere più semplice l'utilizzo di STLport.
ecco come ho configurato STLPort per funzionare con Android Froyo.
// The code
// The set of definitions and includes for STLPort
// They used defined() instead of #ifdef.
#define _STLP_HAS_INCLUDE_NEXT 1
#define _STLP_USE_MALLOC 1
#define _STLP_USE_NO_IOSTREAMS 1
#include <stl/config/_android.h>
#include <map>
#include <string>
// Android.mk
# For Android STL support
LOCAL_C_INCLUDES += external/stlport/stlport
LOCAL_SHARED_LIBRARIES += libstlport
Andrew
Nota che il riferimento al repository git nel link dalla risposta di Stjepan Rajko non esiste più. Fonti alternative sono su anddev e, tramite git, su git: // stlport .git.sourceforge.net / gitroot / STLport / STLport. Ho trovato quest'ultimo in discussione più lunga sull'utilizzo sia di stlport che di boost su Android.
Fin dalla prima risposta a questa domanda, ho fatto funzionare anddev STLPort con la mia libreria che chiama anche boost, incluso il problematico shared_ptr. Per i dettagli della mia soluzione vedere questa domanda .