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.

È stato utile?

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 .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top