No puede incluir encabezados C ++ como vector en Android NDK

Cuando bash incluir cualquier clase de C ++ como vector en mi proyecto Android NDK (usando NDK r5b, la última), me sale un error como el siguiente …

Compile++ thumb : test-libstl <= test-libstl.cpp /Users/nitrex88/Desktop/Programming/EclipseProjects/STLTest/jni/test-libstl.cpp:3:18: error: vector: No such file or directory

Otras personas que informaron este problema en línea han reclamado el éxito al agregar

APP_STL := stlport_static

a su archivo Application.mk. Hice esto y probé cualquier otro valor posible para APP_STL. He limpiado para proyectar, ejecuté ndk-build clean, borré las carpetas obj y libs, y aún cuando compilo no puedo encontrar la clase vectorial. He estado trabajando en esto durante varias semanas (desde que apareció NDK r5) y realmente agradecería si alguien tuviera algún consejo. ¡Gracias!

Es posible. Aquí hay algunos paso a paso:

En $ PROJECT_DIR / jni / Application.mk :

 APP_STL := stlport_static 

Intenté usar stlport_shared, pero no tuve suerte. Lo mismo con libstdc ++.

En $ PROJECT_DIR / jni / Android.mk :

 LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := hello-jni LOCAL_SRC_FILES := hello-jni.cpp LOCAL_LDLIBS := -llog include $(BUILD_SHARED_LIBRARY) 

No hay nada especial aquí, pero asegúrese de que sus archivos sean .cpp .

En $ PROJECT_DIR / jni / hello-jni.cpp :

 #include  #include  #include  #include  #include  #define LOG_TAG "hellojni" #define LOGI(...) __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__) #define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__) #ifdef __cplusplus extern "C" { #endif // Comments omitted. void Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env, jobject thiz ) { std::vector vec; // Go ahead and do some stuff with this vector of strings now. } #ifdef __cplusplus } #endif 

Lo único que me pica aquí fue #ifdef __cplusplus.

Mira los directorios.

Para comstackr, use ndk-build clean && ndk-build .

Si está utilizando Android Studio y todavía está viendo el mensaje “error: vector: No hay tal archivo o directorio” (u otros errores relacionados con stl) cuando está comstackndo usando ndk, entonces esto podría ayudarlo.

En su proyecto, abra el archivo build.gradle del módulo (no el build.grade de su proyecto, sino el que corresponde a su módulo) y agregue ‘stl’ stlport_shared ” dentro del elemento ndk en defaultConfig.

Por ejemplo:

 android { compileSdkVersion 21 buildToolsVersion "21.1.2" defaultConfig { applicationId "com.domain.app" minSdkVersion 15 targetSdkVersion 21 versionCode 1 versionName "1.0" ndk { moduleName "myModuleName" stl "stlport_shared" } } } 

Estoy usando Android Studio y, a partir del 19 de enero de 2016, esto fue lo mejor para mí. (Esto parece algo que cambia cada año más o menos)

Vaya a: aplicación -> Gradle Scripts -> build.gradle (Módulo: aplicación)

Luego, debajo del modelo {… android.ndk {… y agrega una línea: stl = “gnustl_shared”

Me gusta esto:

 model { ... android.ndk { moduleName = "gl2jni" cppFlags.add("-Werror") ldLibs.addAll(["log", "GLESv2"]) stl = "gnustl_shared" // < -- this is the line that I added } ... } 

Incluso Sebastian había dado una buena respuesta allí hace 3 años más, todavía me gustaría compartir una nueva experiencia aquí, en caso de que se enfrenten al mismo problema que yo en la nueva versión de ndk.

Tengo un error de comstackción como:

 fatal error: map: No such file or directory fatal error: vector: No such file or directory 

Mi entorno es android-ndk-r9d y adt-bundle-linux-x86_64-20140702. Agrego el archivo Application.mk en la misma carpeta jni e inserto una (y solo una) línea:

 APP_STL := stlport_static 

¡Pero desafortunadamente, no resuelve mi problema! Tengo que agregar estas 3 líneas a Android.mk para resolverlo:

 ifndef NDK_ROOT include external/stlport/libstlport.mk endif 

Y vi un buen intercambio desde aquí que dice “‘stlport_shared’ es preferido”. Entonces, tal vez sea una mejor solución usar stlport como una biblioteca compartida en lugar de estática. Simplemente agregue las siguientes líneas en Android.mk y luego no es necesario agregar el archivo Application.mk.

 ifndef NDK_ROOT include external/stlport/libstlport.mk endif LOCAL_SHARED_LIBRARIES += libstlport 

Espero que esto sea útil.

Permítanme agregar un poco a la respuesta de Sebastian Roth.

Su proyecto puede ser comstackdo usando ndk-build en la línea de comando después de agregar el código que Sebastian había publicado. Pero en cuanto a mí, hubo errores de syntax en Eclipse, y no tuve la finalización del código.

Tenga en cuenta que su proyecto debe convertirse en un proyecto de C / C ++.

Cómo convertir un proyecto C / C ++

Para solucionar este problema, haga clic derecho en su proyecto, haga clic en Propiedades

Elija C / C ++ General -> Rutas y símbolos e incluya el ${ANDROID_NDK}/sources/cxx-stl/stlport/stlport para Incluir directorios

Haga clic en cuando aparezca un cuadro de diálogo.

Diálogo

antes de

antes de

Después

Después

Actualización # 1

GNU C. Agregar directorios, reconstruir. No habrá ningún error en los archivos fuente C
GNU C ++. Agregar directorios, reconstruir No habrá ningún error en los archivos fuente CPP .

Si está utilizando ndk r10c o posterior, simplemente agregue APP_STL = c ++ _ static a Application.mk

En Android NDK, vaya a android-ndk-r9b> / sources / cxx-stl / gnu-libstdc ++ / 4.X / include en máquinas Linux

Encontré una solución en el siguiente enlace http://osdir.com/ml/android-ndk/2011-09/msg00336.html