web-dev-qa-db-fra.com

Impossible d’inclure des en-têtes C ++ tels que vector dans Android NDK

Lorsque j'essaie d'inclure une classe C++ telle que vector dans mon projet Android NDK (à l'aide de NDK r5b, le plus récent)), j'obtiens une erreur comme celle-ci ...

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

D'autres personnes qui ont signalé ce problème en ligne ont affirmé leur succès en ajoutant

APP_STL := stlport_static

à leur fichier Application.mk. J'ai fait cela et essayé toutes les autres valeurs possibles pour APP_STL. J'ai nettoyé pour projeter, lancé ndk-build clean, supprimé les dossiers obj et libs et, quand je le compile, je ne trouve toujours pas la classe de vecteur. J'y travaille depuis plusieurs semaines (depuis la sortie de NDK R5) et j'apprécierais vraiment si quelqu'un avait des conseils. Merci!

82
Nitrex88

C'est possible. Voici quelques pas à pas:

Dans $ PROJECT_DIR/jni/Application.mk:

APP_STL                 := stlport_static

J'ai essayé d'utiliser stlport_shared, mais pas de chance. Même chose avec libstdc ++.

Dans $ 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)

Rien de spécial ici, mais assurez-vous que vos fichiers sont . Cpp.

Dans $ 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

La seule chose qui m'a mordu ici était # ifdef __cplusplus.

Regardez les annuaires.

Pour compiler, utilisez ndk-build clean && ndk-build.

120
Sebastian Roth

Si vous utilisez Android studio et que vous voyez toujours le message "erreur: vecteur: Aucun fichier ou répertoire de ce type" (ou autre erreur liée à stl) lorsque vous compilez avec ndk, cela pourrait vous aider.

Dans votre projet, ouvrez le fichier build.gradle du module (pas le build.grade de votre projet, mais celui qui est destiné à votre module) et ajoutez 'stl "stlport_shared"' dans l'élément ndk dans defaultConfig.

Pour par exemple:

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"
        }
    }
}
20
rlcoder

J'utilise Android Studio et à compter du 19 janvier 2016, tout se passe bien pour moi. (Cela semble être quelque chose qui change chaque année ou à peu près).

Allez à: app -> Gradle Scripts -> build.gradle (module: app)

Puis sous le modèle {... Android.ndk {... et ajoutez une ligne: stl = "gnustl_shared"

Comme ça:

model {

    ...

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

    ...

}
9
kynnysmatto

Laissez-moi ajouter un peu à réponse de Sebastian Roth.

Votre projet peut être compilé en utilisant ndk-build dans la ligne de commande après avoir ajouté le code que Sebastian avait posté. Mais pour moi, il y avait des erreurs de syntaxe dans Eclipse, et je n'avais pas de code complet.

Notez que votre projet doit être converti en projet C/C++.

Comment convertir un projet C/C++

Pour résoudre ce problème, cliquez avec le bouton droit de la souris sur votre projet, cliquez sur Propriétés.

Choisissez Général C/C++ -> Chemins et symboles et incluez le ${Android_NDK}/sources/cxx-stl/stlport/stlport à Inclure les répertoires

Cliquez sur Yes quand une boîte de dialogue apparaît.

Dialog

Avant

Before

Après

After

Mise à jour # 1

GNU C. Ajoutez des répertoires, reconstruisez. Il n'y aura pas d'erreur dans les fichiers source [~ # ~] c [~ # ~]
GNU C++. Ajoutez des répertoires, reconstruisez. Il n'y aura pas d'erreur dans les fichiers source [~ # ~] cpp [~ # ~] .

4
Maksim Dmitriev

Même si Sebastian avait donné une bonne réponse il y a encore 3 ans, je voudrais encore partager une nouvelle expérience ici, au cas où vous auriez le même problème que moi dans la nouvelle version de ndk.

J'ai des erreurs de compilation telles que:

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

Mon environnement est Android-ndk-r9d et adt-bundle-linux-x86_64-20140702. J'ajoute le fichier Application.mk dans le même dossier jni et insère une (et une seule) ligne:

APP_STL := stlport_static

Mais malheureusement, cela ne résout pas mon problème! Je dois ajouter ces 3 lignes dans Android.mk pour le résoudre:

ifndef NDK_ROOT
include external/stlport/libstlport.mk
endif

Et j'ai vu un bon partage de ici qui dit "" stlport_shared "est préféré". Il est donc préférable d’utiliser stlport en tant que bibliothèque partagée au lieu de statique. Il suffit d’ajouter les lignes suivantes dans Android.mk sans avoir besoin d’ajouter de fichier Application.mk.

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

J'espère que c'est utile.

4
gary

Si vous utilisez ndk r10c ou une version ultérieure, ajoutez simplement APP_STL = c ++ _ static à Application.mk.

3
clark.li

C’est ce qui a causé le problème dans mon cas (CMakeLists.txt):

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

Cela rend invisibles tous les répertoires d'inclusion définis précédemment. Après avoir supprimé/refacturé cette ligne, tout fonctionne correctement.

1
Fedorov7890

Dans Android NDK, accédez à Android-ndk-r9b>/sources/cxx-stl/gnu-libstdc ++/4.X/include dans les machines Linux

J'ai trouvé une solution à partir du lien ci-dessous http://osdir.com/ml/Android-ndk/2011-09/msg00336.html

0
Rojesh