c++ - ndk - uSTL o STLPort para Android?
android ndk location (6)
Estoy trabajando con Android NDK, y dado que actualmente no es compatible con STL, me preguntaba si hay personas brillantes que hayan tenido éxito con esto, o si saben cuál es más adecuado para la plataforma Android: uSTL o STLPort.
EDITAR: Parece que otra opción puede ser CrystaX .NET .
De su sitio web:
... distribución personalizada de Android NDK r3 que he reconstruido a partir de fuentes oficiales. Se agregó compatibilidad con excepciones de C ++, RTTI y biblioteca estándar de C ++.
Hace poco 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 de cómo configurarla .
Supongo que eso podría hacer que sea más fácil ir con STLport.
Solo tenga en cuenta que uSTL se desvía bastante del estándar. Por ejemplo, asume la codificación UTF-8 para std :: string. Todavía parece interesante, sin embargo ...
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
Andrés
¡STLport es compatible desde Android2.3 ahora!
Los puertos de STL están oficialmente disponibles en Android NDK desde la versión r5 en adelante. Se puede usar como una biblioteca estática o compartida. Las siguientes implementaciones están disponibles precompiladas con NDK:
- STLport , basado en v5.2.0:
- static
stlport_static
: use 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.
- static
- GNU libstdc ++
system
(biblioteca estática)
La forma más fácil y recomendada de usarlo en tiempo de compilación es definir APP_STL en Application.mk, de esta forma:
APP_STL := stlport_static
Y si quiere reconstruirlo (esto no es 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 :
- C ++ Excepciones no soportadas
- RTTI no es compatible
- "
wchar_t
probables" en soporte parawchar_t
y configuraciones regionales
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
- sources / cxx-stl / gnu-libstdc ++
Descargue NDK + documentos aquí ; file bugs aquí
Debajo hay un extracto de docs / CPLUSPLUS-SUPPORT.html (de NDK docs, r5)
III. Seleccionar la implementación de la biblioteca estándar de C ++:
De forma predeterminada, los encabezados y las bibliotecas para la biblioteca mínima del sistema de tiempo de ejecución de C ++ (/system/lib/libstdc++.so) se utilizan al compilar fuentes C ++.
Sin embargo, puede seleccionar una implementación diferente estableciendo la variable APP_STL en otra cosa en su Application.mk, por ejemplo:
APP_STL: = stlport_static
Para seleccionar la implementación de STLport estática provista con este NDK. Los valores de valor de APP_STL son los siguientes:
sistema -> Utilice la biblioteca de tiempo de ejecución de C ++ mínima predeterminada. stlport_static -> Usa STLport construido como una biblioteca estática. stlport_shared -> Usa STLport construido como biblioteca compartida.
ADVERTENCIA: 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.
ADVERTENCIA: FIN DE IMPORTANTE CAVEAT
Se prefiere "stlport_shared" si tiene varias bibliotecas compartidas en su proyecto que usan C ++ STL, ya que evita la duplicación de funciones y, lo que es más importante, de variables globales (por ejemplo, std :: cout) en cada una de ellas, lo que puede tener resultados sorprendentes .
Por otro lado, deberá 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 tanto "libfoo.so" como "libbar.so" dependen de "libstlport_shared.so".
Tenga en cuenta que el nombre de la biblioteca compartida es "libstlport_shared.so" para evitar conflictos de nombres con ciertas imágenes del sistema Android que incluyen un libstlport.so a nivel de sistema (que no es estable a ABI y no puede usarse desde código de máquina generado por NDK) .
"stlport_static" es preferible si solo tiene una biblioteca compartida en su proyecto: solo las funciones y variables de STL que realmente necesita se vincularán a su código de máquina, lo que reducirá el tamaño del código y no tendrá que cargar el stlport_shared dinámico en puesta en marcha.
IV. Problemas específicos de STLport:
Este NDK proporciona bibliotecas precompiladas estáticas y compartidas para STLport, pero puede obligarlo a reconstruirlo desde las fuentes definiendo lo siguiente en su entorno o su Application.mk antes de compilarlo:
STLPORT_FORCE_REBUILD := true
STLport está licenciado bajo una licencia de código abierto de estilo BSD. Consulte sources / cxx-stl / stlport / README para obtener más detalles sobre la biblioteca.
V. Planes futuros:
- Haga que STLport sea compatible con las excepciones de C ++ y RTTI
- Soporte completo de GNU libstdc ++
- soporte USTL?
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 una discusión más larga sobre el uso de stlport y boost bajo Android.
Desde la primera vez que respondí esta pregunta, obtuve el anddev STLPort para trabajar con mi biblioteca que también llama boost, incluyendo el problemático shared_ptr. Para detalles de mi solución, vea esta pregunta .