studio - No puede incluir encabezados C++ como vector en Android NDK
android ndk location (7)
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
Cuando intento 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 <string.h>
#include <jni.h>
#include <android/log.h>
#include <iostream>
#include <vector>
#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<std::string> 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 compilar, use ndk-build clean && ndk-build
.
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 compilació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 here 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 compilado 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 sintaxis 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 Sí cuando aparezca un cuadro de diálogo.
antes de
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 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á compilando 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"
}
}
}
Si está utilizando ndk r10c o posterior, simplemente agregue APP_STL = c ++ _ static a Application.mk