Android ndk-build iostream: нет такого файла или каталога - PullRequest
35 голосов
/ 03 февраля 2012

У меня проблема с компиляцией файла cpp с помощью инструмента ndk-build (windows 7 с cygwin). Ошибка появляется при попытке скомпилировать файл cpp с помощью #include:

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)

У меня есть файл iostream в папке android ndk (NDK_ROOT \ sources \ cxx-stl \ gnu-libstdc ++ \ include) но я понятия не имею, как сказать компилятору искать iotream (и другие стандартные заголовочные файлы) в этой папке.

Кажется, мне не хватает одной или нескольких переменных среды, или некоторыхфлаги компилятора.

Ответы [ 5 ]

62 голосов
/ 03 февраля 2012

Я думаю, что «APP_STL: = stlport_static» должно быть в файле Application.mk.

Создайте файл «Application.mk» и напишите в нем «APP_STL: = stlport_static».

2 голосов
/ 23 апреля 2014

Это работает для меня.

LOCAL_STATIC_LIBRARIES +=  libstlport

LOCAL_C_INCLUDES += external/stlport/stlport 
LOCAL_C_INCLUDES += bionic
1 голос
/ 01 сентября 2016

Добавление

APP_PLATFORM := android-23

Или любая ревизия, которую вы используете, решила это для меня.

0 голосов
/ 16 июля 2019

Просто потратили несколько дней, чтобы обновить мой 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)

Приложение.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 и соберите исполняемый файл

enter image description here

Для получения дополнительной информации об этом, проверьте my GitHub

0 голосов
/ 04 декабря 2012

Обновите свой Android ndk до последней версии.Я столкнулся с ошибкой в ​​Android ndk ver 5

...