【问题标题】:Android ndk-build iostream: No such file or directoryAndroid ndk-build iostream:没有这样的文件或目录
【发布时间】:2012-02-26 04:13:16
【问题描述】:

我在使用 ndk-build 工具编译 cpp 文件时遇到问题(带有 cygwin 的 windows 7) 当我尝试使用 #include 编译 cpp 文件时出现错误:

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

这是我的 cpp 文件:

#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

这是我的 Android.mk 文件:

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)

我在 android ndk 文件夹 (NDK_ROOT\sources\cxx-stl\gnu-libstdc++\include) 中有 iostream 文件,但我不知道如何告诉编译器在其中查找 iotream(和其他标准头文件)那个文件夹。

似乎我缺少一个或几个环境变量,或者一些编译器标志。

【问题讨论】:

    标签: android android-ndk cygwin iostream


    【解决方案1】:

    我认为“APP_STL:=stlport_static”必须在 Application.mk 文件中。

    创建一个“Application.mk”文件并在其中写入“APP_STL:=stlport_static”。

    【讨论】:

    • 我在 Android.mk 中得到了这一行,你可以在我的帖子中看到。
    • 您应该将该行放在 APPLICATION.mk 文件中,而不是 ANDROID.mk 中
    • 是的! APPLICATION.mk 的作用与 ANDROID.mk 不同,它必须在 jni 的根目录 (-> projet_dir/jni/Application.mk) 创建。 (感谢马丁斯)
    • 你可能会遇到 shared_ptr 错误,所以在这种情况下使用:APP_STL := gnustl_static
    • 使用 Gradle 2.10/experimental:0.6.0-alpha7 时该怎么办?
    【解决方案2】:

    这对我有用。

    LOCAL_STATIC_LIBRARIES +=  libstlport
    
    LOCAL_C_INCLUDES += external/stlport/stlport 
    LOCAL_C_INCLUDES += bionic
    

    【讨论】:

    • bionic 是干什么用的??
    【解决方案3】:

    添加

    APP_PLATFORM := android-23
    

    或者你使用的任何版本都为我解决了这个问题。

    【讨论】:

      【解决方案4】:

      将您的 android ndk 更新到最新版本。 我在 android ndk ver 5 中遇到了错误

      【讨论】:

      • 我在 Android Studio 2.1.1 中使用 ndk。仍然出现同样的错误。
      【解决方案5】:

      刚刚花了几天时间将我的 NDK 从 r10e 更新到 r20,有几个变量发生了变化。

      对于 NDK r10e

      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)
      

      Application.mk:

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

      对于 NDK r20

      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)
      

      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
      

      还有我的 main.cpp(包括我的 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;}
      

      运行 ndk-build 并构建可执行文件

      有关更多源代码和信息,请查看my GitHub

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-27
        • 1970-01-01
        相关资源
        最近更新 更多