36 votes

Android ndk-build iostream : Aucun fichier ou répertoire de ce type

Je rencontre un problème lors de la compilation d'un fichier .cpp à l'aide de l'outil ndk-build (Windows 7 avec Cygwin).

L'erreur apparaît lorsque j'essaie de compiler le fichier .cpp avec #include :

jni/native.cpp:5:20: error: iostream: No such file or directory

Voici mon .cpp fichier :

#include <jni.h>
#include <string.h>
#include <stdio.h>
#include <android/log.h>
#include <iostream>

#define DEBUG_TAG "NDK_SampleActivity"
#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

void Java_com_test_ndk_SampleActivity_helloLog(JNIEnv* env, jobject thisobj, jstring logThis)
{
    jboolean isCopy;

    const char * szLogThis = env->GetStringUTFChars(logThis, &isCopy);

    __android_log_print(ANDROID_LOG_DEBUG, DEBUG_TAG, "NDK:LC: [%s]", szLogThis);

    env->ReleaseStringUTFChars(logThis, szLogThis);
}

#ifdef __cplusplus
}
#endif

Et voici mon Android.mk fichier :

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

APP_STL:=stlport_static

LOCAL_LDLIBS := -llog

LOCAL_MODULE    := swingbyte-android

LOCAL_SRC_FILES := native.cpp

LOCAL_C_INCLUDES := $(LOCAL_PATH)/include-all
include $(BUILD_SHARED_LIBRARY)

J'ai un fichier iostream dans le dossier Android NDK (*NDK_ROOT \sources\cxx -stl \gnu -libstdc++ \include *), mais je n'ai aucune idée de comment dire au compilateur de chercher iostream (et d'autres fichiers d'en-tête standard) dans ce dossier.

Il semble qu'il me manque une ou plusieurs variables d'environnement, ou certains drapeaux du compilateur.

61voto

Gaetan Points 426

Je pense que "APP_STL:=stlport_static" doit se trouver dans le fichier Application.mk.

Créez un fichier "Application.mk" et écrivez-y "APP_STL:=stlport_static".

0 votes

J'ai obtenu cette ligne dans Android.mk, vous pouvez la voir dans mon message.

7 votes

Vous devez placer cette ligne dans le fichier APPLICATION.mk, et non dans Android.mk.

3 votes

Yep ! APPLICATION.mk a un rôle différent de Android.mk, et il doit être créé à la racine de jni (-> projet_dir/jni/Application.mk). (merci Martins)

2voto

iwtu Points 99

Cela fonctionne pour moi.

LOCAL_STATIC_LIBRARIES +=  libstlport

LOCAL_C_INCLUDES += external/stlport/stlport 
LOCAL_C_INCLUDES += bionic

0 votes

Qu'est-ce que bionic pour ?

1voto

Antzi Points 1251

Ajout

APP_PLATFORM := android-23

Ou quelle que soit la révision que vous utilisez, elle a été résolue pour moi.

0voto

牟家宏 Points 11

Je viens de passer plusieurs jours à mettre à jour mon NDK de r10e à r20, et il y a plusieurs variables qui sont modifiées.

Pour NDK r10e

Fichier Android.mk :

include $(CLEAR_VARS)
LOCAL_MODULE := main
LOCAL_SRC_FILES := ./main.cpp
LOCAL_C_INCLUDES += $(LOCAL_PATH)/
LOCAL_CPP_EXTENSION := .cxx .cpp .cc
LOCAL_CPPFLAGS := -fexceptions -frtti
LOCAL_CPPFLAGS += -std=c++11 -D__cplusplus=201103L
include $(BUILD_EXECUTABLE)

Fichier Application.mk :

APP_ABI := all
APP_STL := gnustl_static
NDK_TOOLCHAIN_VERSION := 4.9
APP_OPTIM := debug

Pour NDK r20

Fichier Android.mk :

include $(CLEAR_VARS)
LOCAL_MODULE := main
LOCAL_SRC_FILES := ./main.cpp
LOCAL_C_INCLUDES += $(LOCAL_PATH)/
LOCAL_CPP_EXTENSION := .cxx .cpp .cc
LOCAL_CPPFLAGS := -fexceptions -frtti
LOCAL_CPPFLAGS += -std=c++11 -D__cplusplus=201103L -DANDROID_STL=c++_shared
include $(BUILD_EXECUTABLE)

Fichier Application.mk :

APP_ABI := all
# In general, you can only use a static variant of the C++ runtime if you have one and only one shared library in your application.
APP_STL := c++_static
NDK_TOOLCHAIN_VERSION := clang
APP_PLATFORM := android-23
APP_OPTIM := debug

Et mon main.cpp (y compris mon bin_node.h ) :

int main(int argc, char **argv) {
    printf("****************** tree node ******************\n");
    amo::BinNode<int> root(0);
    amo::BinNode<int>* lchild1 = root.insertLeftChild(1);
    amo::BinNode<int>* rchild2 = root.insertRightChild(2);
    amo::BinNode<int>* lchild3 = lchild1->insertLeftChild(3);
    amo::BinNode<int>* rchild4 = lchild1->insertRightChild(4);
    amo::BinNode<int>* lchild5 = rchild2->insertLeftChild(5);
    amo::BinNode<int>* rchild6 = rchild2->insertRightChild(6);
    amo::BinNode<int>* lchild7 = lchild3->insertLeftChild(7);
    amo::BinNode<int>* rchild8 = lchild3->insertRightChild(8);
    amo::BinNode<int>* lchild9 = rchild6->insertLeftChild(9);
    amo::BinNode<int>* rchild10 = rchild6->insertRightChild(10);
    amo::BinNode<int>* lchild11 = rchild8->insertLeftChild(11);
    amo::BinNode<int>* rchild12 = rchild8->insertRightChild(12);

    printf("going to root.traversePre()\n");
    root.traversePre();

    printf("going to root.traversePreLoop()\n");
    root.traversePreLoop();

    printf("going to root.traversePreLoop2()\n");
    root.traversePreLoop2();

    printf("\n****************** main return ******************\n");

    return 0;
}

Lancer ndk-build et construire un fichier exécutable

Enter image description here

Pour plus de code source et d'informations à ce sujet, consultez le site suivant mon GitHub .

0voto

Napolean Points 383

Mettez à jour votre NDK Android.

J'ai rencontré l'erreur avec la version 5 du NDK Android.

1 votes

J'utilise ndk dans Android Studio 2.1.1. J'obtiens toujours la même erreur.

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