No se pueden incluir encabezados C ++ como vector en Android NDK

83

Cuando intento incluir cualquier clase de C ++ como vector en mi proyecto NDK de Android (usando NDK r5b, el último), aparece 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 sobre este problema en línea afirmaron haber tenido éxito al agregar

APP_STL := stlport_static

a su archivo Application.mk. He hecho esto y he probado todos los demás valores posibles para APP_STL. Limpié para proyectar, ejecuté ndk-build clean, eliminé las carpetas obj y libs, y aún cuando compilo no puedo encontrar la clase de vector. He estado trabajando en esto durante varias semanas (desde que salió NDK r5) y realmente agradecería si alguien tuviera algún consejo. ¡Gracias!

Nitrex88
fuente
2
En primer lugar, verifique el directorio android-ndk-r5 \ build \ platform \ android- X\ arch-arm \ usr \ include - ¿ vectorrealmente está ahí?
Seva Alekseyev
2
¡No, no es! No sé mucho sobre cómo funciona el NDK más allá de usar JNI y compilar las fuentes. ¿Cómo puedo conseguir que el vector esté ahí? Veo el vector en android-ndk-r5b / sources / cxx-stl / stlport / stlport si eso significa algo. ¡Gracias por la rápida respuesta y realmente lo aprecio!
Nitrex88
2
@seva Así que intenté ejecutar un montón de herramientas para reconstruir la cadena de herramientas y las precompilaciones (los archivos .sh en la carpeta de herramientas del NDK) y todavía no podía hacer funcionar los encabezados STL. Si descargo el NDK desde el sitio de Android, ¿no debería funcionar todo? Lo intenté y la descarga nueva no cambia nada. ¿Alguna más información sobre el asunto que pueda ofrecer?
Nitrex88
[Así es como configuré STLPort para que funcione con Android Froyo.] [1] [1]: stackoverflow.com/questions/1650963/ustl-or-stlport-for-android
ZhangXuelian
[Así es como configuré STLPort para que funcione con Android Froyo.] [1] [1]: stackoverflow.com/questions/1650963/ustl-or-stlport-for-android
ZhangXuelian

Respuestas:

121

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)

Aquí no hay nada especial, 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 mordió aquí fue #ifdef __cplusplus.

Mira los directorios.

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

Sebastián Roth
fuente
5
¡¡Gracias Gracias!! Finalmente resolviste mi problema. ¡Resulta que tenía mi Application.mk en el lugar equivocado! Lo tenía en la carpeta del proyecto pero no en la carpeta JNI (no estoy seguro de por qué, pero desde que comencé el desarrollo de Android siempre pensé que iba allí). Ver que pusiste la ruta de Application.mk en la carpeta jni me hizo darme cuenta. ¡Gracias y obtienes la recompensa!
Nitrex88
2
Simplemente creando el Application.mk necesario lo resolvió, pero veo el mensaje Android NDK: You might want to use $NDK/build/tools/build-stlport.sh. NOTA: esto no funcionó con cygwin
Someone Somewhere
hola, puedo construir una aplicación que usa vector.
Código
hola, agregué APP_STL: = stlport_static en el archivo Application.mk y está funcionando para mi aplicación, pero la misma aplicación que incluyo en Android Source, aquí me está dando el error "clase de vector no encontrada ..." durante la compilación del código. los pls me sugieren que alguien tenga una idea al respecto.
Código
1
Quizás puedas subir una muestra de tu proyecto a github y compartir la URL, luego podríamos echar un vistazo.
Sebastian Roth
20

Si está utilizando Android Studio y sigue viendo el mensaje "error: vector: No existe tal archivo o directorio" (u otros errores relacionados con stl) cuando está compilando con 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 es para 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"
        }
    }
}
rlcoder
fuente
1
¿Por qué stlport_sharedy no stlport_static?
IgorGanapolsky
9

Estoy usando Android Studio y, a partir del 19 de enero de 2016, esto funcionó para mí. (Esto parece algo que cambia cada año aproximadamente)

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

Luego, en el modelo {... android.ndk {... y agregue 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
    }

    ...

}
kynnysmatto
fuente
Oye, estoy teniendo este problema con ffmpeg, en realidad ndk build está funcionando bien y está generando con éxito archivos .so, pero faltan archivos de encabezado, ¿tienes alguna idea al respecto? (Estoy usando Android Studio con el complemento experimental de Gradle)
Pushpendra
¿Eso es con el complemento experimental de Gradle?
Sebastian Roth
¿Por qué en gnustl_sharedlugar de gnustl_static?
IgorGanapolsky
Funciona, supongo que esto debería seleccionarse como la respuesta.
Vishnudev K
Intenté esto con el Android Studio 2.1.3 más reciente y no parece funcionar. Para probarlo, tomé la aplicación de muestra HelloJNI, renombré hello-jni.c a .cpp y le agregué un #include <vector>. fatal error: 'vector' file not found #include <vector>Aparece el error: ¿Se necesitan pasos adicionales después de agregar stl = "gnustl_static" o "gnustl_shared" al archivo gradle del módulo?
SideLobe
4

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 enfrente el 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 en Android.mk para resolverlo:

ifndef NDK_ROOT
include external/stlport/libstlport.mk
endif

Y vi un buen intercambio desde aquí que dice "se prefiere 'stlport_shared'". 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.

Gary
fuente
Para que quede claro, cuando dice "misma carpeta jni", ¿se refiere a la carpeta jni del proyecto de Android? Quiero asegurarme de que no haya otra ubicación que deba conocer. nota al margen: ese buen enlace para compartir está muerto ahora :(
Hunter-Orionnoir
4

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

Su proyecto se puede compilar usando ndk-builden 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 completé el código.

Tenga en cuenta que su proyecto debe convertirse a un proyecto 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 los directorios${ANDROID_NDK}/sources/cxx-stl/stlport/stlport para incluir

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

Diálogo

antes de

antes de

Después

Después

Actualización n. ° 1

GNU C. Agregar directorios, reconstruir. No habrá ningún error en C archivos de código fuente
GNU C ++. Agregue directorios, reconstruya. No habrá errores en los archivos fuente de CPP .

Maksim Dmitriev
fuente
3

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

clark.li
fuente
1

Esto es lo que causó el problema en mi caso ( CMakeLists.txt):

set (CMAKE_CXX_FLAGS "...some flags...")

Hace invisibles todos los directorios de inclusión definidos anteriormente. Después de eliminar / refactorizar esta línea, todo funciona bien.

Fedorov7890
fuente