[android] Android NDK에 벡터와 같은 C ++ 헤더를 포함 할 수 없습니다.

Android NDK 프로젝트 (최신 NDK r5b 사용)에 벡터와 같은 C ++ 클래스를 포함하려고하면 다음과 같은 오류가 발생합니다.

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

이 문제를 온라인으로보고 한 다른 사람들은 다음을 추가하여 성공을 주장했습니다.

APP_STL := stlport_static

Application.mk 파일에 추가합니다. 이 작업을 수행하고 APP_STL에 대해 가능한 다른 모든 값을 시도했습니다. 프로젝트를 정리하고, ndk-build를 정리하고, obj 및 libs 폴더를 삭제했지만 여전히 컴파일 할 때 벡터 클래스를 찾을 수 없습니다. 나는 몇 주 동안 (NDK r5가 나온 이후로)이 작업을 해왔으며 누군가 조언을 해주면 정말 감사하겠습니다. 감사!



답변

것이 가능하다. 다음은 단계별입니다.

에서 $ PROJECT_DIR / JNI / Application.mk :

APP_STL                 := stlport_static

stlport_shared를 사용해 보았지만 운이 없었습니다. libstdc ++와 동일합니다.

에서 $ 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)

여기에 특별한 것은 없지만 파일이 .cpp 인지 확인하십시오 .

에서 $ PROJECT_DIR / JNI / 안녕하세요 – 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

여기서 나를 물린 유일한 것은 #ifdef __cplusplus입니다.

디렉토리를보십시오.

컴파일하려면 ndk-build clean && ndk-build.


답변

Android 스튜디오를 사용 중이고 ndk를 사용하여 컴파일 할 때 “error : vector : No such file or directory”(또는 기타 stl 관련 오류) 메시지가 계속 표시되는 경우 도움이 될 수 있습니다.

프로젝트에서 모듈의 build.gradle 파일 (프로젝트의 build.grade가 아니라 모듈 용 파일)을 열고 defaultConfig의 ndk 요소 내에 ‘stl “stlport_shared”‘를 추가합니다.

예 :

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


답변

저는 Android Studio를 사용하고 있으며 2016 년 1 월 19 일에 이것이 저에게 트릭을 제공했습니다. (매년마다 바뀌는 것 같습니다)

이동 : app-> Gradle Scripts-> build.gradle (모듈 : app)

그런 다음 {… android.ndk {… 모델 아래에 다음 행을 추가하십시오. stl = “gnustl_shared”

이렇게 :

model {

    ...

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

    ...

}


답변

세바스찬도 3 년 전에 좋은 대답을했지만 새로운 ndk 버전에서 저와 같은 문제에 직면하게 될 경우를 대비하여 여기에서 새로운 경험을 공유하고 싶습니다.

다음과 같은 컴파일 오류가 있습니다.

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

내 환경은 android-ndk-r9d 및 adt-bundle-linux-x86_64-20140702입니다. 동일한 jni 폴더에 Application.mk 파일을 추가하고 한 줄만 삽입합니다.

APP_STL := stlport_static

하지만 안타깝게도 문제가 해결되지 않습니다! 이 문제를 해결하려면이 3 줄을 Android.mk에 추가해야합니다.

ifndef NDK_ROOT
include external/stlport/libstlport.mk
endif

그리고 여기 에서 ” ‘stlport_shared’가 선호됩니다” 라는 좋은 공유를 보았습니다 . 따라서 stlport를 정적 대신 공유 라이브러리로 사용하는 것이 더 나은 솔루션 일 수 있습니다. Android.mk에 다음 행을 추가하기 만하면 Application.mk 파일을 추가 할 필요가 없습니다.

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

이것이 도움이되기를 바랍니다.


답변

Sebastian Roth의 대답에 약간을 추가하겠습니다 .

ndk-buildSebastian이 게시 한 코드를 추가 한 후 명령 줄에서 사용하여 프로젝트를 컴파일 할 수 있습니다 . 그러나 저에게는 Eclipse에 구문 오류가 있었고 코드 완성이 없었습니다.

프로젝트는 C / C ++ 프로젝트로 변환되어야합니다.

C / C ++ 프로젝트를 변환하는 방법

이 문제를 해결하려면 프로젝트를 마우스 오른쪽 버튼으로 클릭하고 속성을 클릭합니다.

선택 C / C ++ 일반 > – 경로 및 기호 와 포함 ${ANDROID_NDK}/sources/cxx-stl/stlport/stlport하는 디렉토리를 포함

대화 상자가 나타나면 예를 클릭하십시오 .

대화

전에

전에

후

업데이트 # 1

GNU C. 디렉토리를 추가하고 다시 빌드합니다. C 소스 파일
GNU C ++ 에는 오류가 없습니다 . 디렉토리를 추가하고 다시 빌드하십시오. CPP 소스 파일 에는 오류가 없습니다 .


답변

ndk r10c 이상을 사용하는 경우 Application.mk에 APP_STL = c ++ _ static을 추가하기 만하면됩니다.


답변

이것이 내 경우 ( CMakeLists.txt) 에서 문제의 원인입니다 .

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

이전에 정의 된 모든 포함 디렉토리를 보이지 않게합니다. 이 줄을 제거 / 리팩토링하면 모든 것이 잘 작동합니다.