84 votes

Peut ' t inclure des en-têtes de C++ comme vecteur dans Android NDK

Quand j'essaie de comprendre toute la classe C++ comme vecteur dans mon Android NDK projet (à l'aide de NDK r5b, la dernière en date), j'obtiens un message d'erreur semblable à la suivante...

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 prétendu succès par l'ajout d'

APP_STL := stlport_static

pour leur Application.mk fichier. Je l'ai fait ainsi que essayé toutes les autres valeurs possibles pour APP_STL. J'ai nettoyé le projet, a couru ndk-build propre, supprimé l'obj et libs dossiers, et encore quand je compile il ne peut pas trouver la classe vector. J'ai travaillé sur cette question depuis un certain nombre de semaines maintenant (depuis le NDK r5 est sorti), et serait vraiment reconnaissant si quelqu'un a des conseils. Merci!

121voto

Sebastian Roth Points 5091

Il est possible. Voici, étape par étape:

Dans $PROJECT_DIR/jni/de l'Application.mk:

APP_STL                 := stlport_static

J'ai essayé d'utiliser stlport_shared, mais pas de chance. Même 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 .le rpc.

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 me mordre ici était #ifdef __cplusplus.

Regarder les répertoires.

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

4voto

Maksim Dmitriev Points 515

Permettez-moi d'ajouter un peu de Sébastien Roth réponse.

Votre projet peut être compilé en utilisant ndk-build dans la ligne de commande après l'ajout du code Sebastian avait posté. Mais comme pour moi, il y avait des erreurs de syntaxe dans Eclipse, et je n'ai pas eu la complétion de code.

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

Comment faire pour convertir un C/C++ projet

Pour résoudre ce problème, cliquez-droit sur votre projet, cliquez sur Propriétés

Choisir C/C++ Général -> Chemins et des Symboles et comprennent l' ${ANDROID_NDK}/sources/cxx-stl/stlport/stlport d' Inclure des répertoires

Cliquez sur Oui lorsqu'une boîte de dialogue s'affiche.

Dialog

Avant

Before

Après

After

Mise à jour #1

GNU C. Ajouter des répertoires, de les reconstruire. Il n'y aura pas d'erreurs dans C les fichiers source
C++ DE GNU. Ajouter des répertoires, de les reconstruire. Il n'y aura pas toutes les erreurs dans le RPC fichiers sources.

4voto

gary Points 59

Même Sebastian avait donné une bonne réponse il y a 3 ans, j'aimerais partager une nouvelle expérience ici, dans le cas où vous ferez face à un même problème que moi en nouvelle-ndk version.

J'ai des erreur de compilation, tels 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'ai ajouter une Application.mk fichier dans le même jni dossier et insérer un (et un seul):

APP_STL := stlport_static

Mais malheureusement, ça 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 à partir d' ici, qui dit "'stlport_shared" est préféré". Donc, c'est peut-être une meilleure solution à utiliser stlport comme une bibliothèque partagée plutôt que statique. Il suffit d'ajouter les lignes suivantes dans Android.mk et puis pas besoin d'ajouter le fichier de l'Application.mk.

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

Espérons que cela est utile.

0voto

Rojesh Points 56

Dans android NDK aller à android-ndk-r9b>/sources/cxx-stl/gnu-libstdc++/4.X/include dans les machines linux

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X