Pregunta

Estoy trabajando con el NDK de Android, y dado que actualmente no es compatible con el STL, me preguntaba si hay personas brillantes que hayan tenido éxito con esto o sepan cuál es el más adecuado para la plataforma Android. : uSTL o STLPort.

EDITAR: Parece que otra opción puede ser CrystaX .NET .

Desde su sitio web:

  

... distribución personalizada de Android   NDK r3 que he reconstruido desde   fuentes oficiales Soporte de C ++   excepciones, RTTI y Standard C ++   Biblioteca agregada.

¿Fue útil?

Solución

¡

STLport soportado desde Android2.3 ahora!

Otros consejos

Los

puertos de STL están oficialmente disponibles en el NDK de Android desde la versión r5 en adelante. Se puede usar como biblioteca estática o compartida. Las siguientes implementaciones están disponibles preconstruidas con el NDK:

  • STLport , basado en v5.2.0:
    • static stlport_static : utilícelo si solo tiene una biblioteca dinámica en su proyecto.
    • dynamic stlport_shared : para usar si tiene más de una biblioteca dinámica en su proyecto.
  • GNU libstdc ++ system (biblioteca estática)

La forma fácil y recomendada de usarlo en el momento de la compilación es definiendo APP_STL en Application.mk, así:

APP_STL := stlport_static

Y si desea reconstruirlo (esto es no necesario), defina STLPORT_FORCE_REBUILD en su Application.mk:

STLPORT_FORCE_REBUILD := true

El marco de prueba de unidad para STLport también está disponible.

Limitaciones actuales para STLport :

  • Excepciones de C ++ no compatibles
  • RTTI no es compatible
  • " Errores probables " en soporte para wchar_t y locales

Varios enlaces:

La documentación está disponible en los paquetes NDK en las siguientes ubicaciones (puede haber más):

  • docsCPLUSPLUS-SUPPORT.html
  • fuentes / cxx-stl / stlport
  • fuentes / cxx-stl / gnu-libstdc ++

Descargue documentos NDK + aquí ; errores de archivo aquí


A continuación se muestra un extracto de docs / CPLUSPLUS-SUPPORT.html (de NDK docs, r5)

III. Selección de la implementación de la biblioteca estándar de C ++:

Por defecto, los encabezados y bibliotecas para el sistema de tiempo de ejecución C ++ mínimo La biblioteca (/system/lib/libstdc++.so) se usa al construir fuentes C ++.

Sin embargo, puede seleccionar una implementación diferente configurando la variable APP_STL a algo más en su Application.mk, por ejemplo:

APP_STL: = stlport_static

Para seleccionar la implementación estática de STLport proporcionada con este NDK. Los valores de APP_STL son los siguientes:

sistema - > Utilice la biblioteca de tiempo de ejecución mínima predeterminada de C ++.    stlport_static - > Utilice STLport construido como una biblioteca estática.    stlport_shared - > Utilice STLport integrado como una biblioteca compartida.

ADVERTENCIA: AVISO IMPORTANTE

 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.

ADVERTENCIA: FIN DE LA CUEVA IMPORTANTE

" stlport_shared " se prefiere si tiene varias bibliotecas compartidas en su   proyecto que usa C ++ STL, porque evita la duplicación de funciones   y más importante de las variables globales (por ejemplo, std :: cout) en cada una de   ellos, que pueden tener resultados sorprendentes.

Por otro lado, tendrá que cargarlo explícitamente al iniciar su   aplicación, como en el siguiente ejemplo:

 static {
     System.loadLibrary("stlport_shared");
     System.loadLibrary("foo");
     System.loadLibrary("bar");
 }

Donde ambos " libfoo.so " y "libbar.so" dependa de " libstlport_shared.so " ;.

Tenga en cuenta que el nombre de la biblioteca compartida si " libstlport_shared.so " para evitar   los nombres entran en conflicto con ciertas imágenes del sistema Android que incluyen un   libstlport.so a nivel de sistema (que no es ABI estable y   no se puede usar desde el código de máquina generado por NDK).

" stlport_static " se prefiere si solo tiene una biblioteca compartida en su   proyecto: solo las funciones y variables STL que realmente necesita serán   vinculado a su código de máquina, reduciendo su tamaño de código, y no necesitará   cargar el stlport_shared dinámico al inicio.

IV. Problemas específicos de STLport:

Este NDK proporciona bibliotecas estáticas y compartidas preconstruidas para STLport, pero puede forzar su reconstrucción desde las fuentes definiendo lo siguiente en su entorno o su Application.mk antes de construir:

<*>

STLport tiene licencia bajo

Solo tenga en cuenta que uSTL se desvía bastante del estándar. Por ejemplo, supone la codificación UTF-8 para std :: string. Sin embargo, todavía parece interesante ...

Recientemente encontré algunos scripts de ayuda y un puerto de STLport para Android , de John Ripley.

También hay una publicación de blog relacionada con instrucciones sobre cómo configurarlo .

Supongo que eso podría facilitar el uso de STLport.

así es como configuré STLPort para que funcione 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

Tenga en cuenta que la mención del repositorio git en el enlace de la respuesta de Stjepan Rajko ya no existe. Las fuentes alternativas están en anddev y, a través de git, en git: // stlport .git.sourceforge.net / gitroot / stlport / stlport. Encontré este último en un discusión más larga sobre el uso de stlport y boost en Android.

Desde la primera vez que respondí esta pregunta, he conseguido que el STLPort de anddev funcione con mi biblioteca que también llama a boost, incluida la problemática shared_ptr. Para obtener detalles de mi solución, consulte esta pregunta .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top