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


83

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가 나온 이후로)이 작업을 해왔으며 누군가 조언을 해주면 정말 감사하겠습니다. 감사!


2
먼저 android-ndk-r5 \ build \ platforms \ android- X\ arch-arm \ usr \ include 디렉토리를 확인 vector하세요. 정말 거기에 있나요?
Seva Alekseyev

2
전혀 그렇지 않다! JNI를 사용하고 소스를 컴파일하는 것 외에 NDK가 어떻게 작동하는지에 대해서는 잘 모릅니다. 벡터를 어떻게 얻을 수 있습니까? android-ndk-r5b / sources / cxx-stl / stlport / stlport에서 벡터를 볼 수 있습니다. 빠른 답장에 감사 드리며 정말 감사합니다!
Nitrex88

2
@seva 그래서 도구 모음과 사전 빌드 (NDK의 도구 폴더에있는 .sh 파일)를 재 구축하기위한 여러 도구를 실행 해 보았지만 여전히 STL 헤더가 작동하지 않았습니다. Android 사이트에서 NDK를 새로 다운로드하면 모든 것이 작동하지 않습니까? 나는 시도했고 신선한 다운로드는 아무것도 변경하지 않습니다. 제공 할 수있는 문제에 대한 더 많은 통찰력이 있습니까?
Nitrex88

[Android Froyo에서 작동하도록 STLPort를 구성한 방법입니다.] [1] [1] : stackoverflow.com/questions/1650963/ustl-or-stlport-for-android
ZhangXuelian 2011

[Android Froyo에서 작동하도록 STLPort를 구성한 방법입니다.] [1] [1] : stackoverflow.com/questions/1650963/ustl-or-stlport-for-android
ZhangXuelian 2011

답변:


121

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

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


5
감사합니다 감사합니다 !! 마침내 내 문제를 해결했습니다. 내 Application.mk가 잘못된 곳에있는 것으로 밝혀졌습니다! 프로젝트 폴더에는 있지만 JNI 폴더에는 없었습니다. jni 폴더에 Application.mk의 경로를 넣는 것을 보면 깨달았습니다. 감사합니다. 현상금을 받으십시오!
Nitrex88

2
필요한 Application.mk를 만드는 것만으로도 문제가 해결되었지만 메시지가 표시 Android NDK: You might want to use $NDK/build/tools/build-stlport.sh됩니다. 참고 : 이것은 cygwin에서 작동하지 않았습니다
Someone Somewhere

안녕하세요, 저는 vector를 사용하는 응용 프로그램을 만들 수 있습니다.
CoDe 2012

안녕하세요, Application.mk 파일에 APP_STL : = stlport_static을 추가했으며 내 애플리케이션에서 작동하지만 Android Source에 포함 된 동일한 애플리케이션에서 코드를 컴파일하는 동안 "vector class not found .."오류가 발생합니다. pls는 나에게 그것에 대해 생각하는 사람을 제안합니다.
CoDe 2012

1
아마도 프로젝트 샘플을 github에 업로드하고 URL을 공유 할 수 있습니다. 그러면 우리가 살펴볼 수 있습니다.
Sebastian Roth

20

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

1
stlport_shared안돼 stlport_static?
IgorGanapolsky

9

저는 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
    }

    ...

}

안녕하세요 ffmpeg 에서이 문제가 발생합니다. 실제로 ndk 빌드가 제대로 작동하고 성공적으로 .so 파일을 생성하지만 헤더 파일이 누락되어 있습니다. (나는 gradle 실험 플러그인과 함께 android studio를 사용하고 있습니다)
Pushpendra

그것은 gradle-experimental 플러그인입니까?
Sebastian Roth

gnustl_shared대신 왜 gnustl_static?
IgorGanapolsky

작동합니다. 이것이 답으로 선택되어야한다고 생각합니다.
Vishnudev K

최신 Android Studio 2.1.3에서 이것을 시도했지만 작동하지 않는 것 같습니다. 이를 테스트하기 위해 HelloJNI 샘플 애플리케이션을 가져와 hello-jni.c를 .cpp로 이름을 바꾸고 #include <vector>를 추가했습니다. 오류가 발생합니다. fatal error: 'vector' file not found #include <vector>stl = "gnustl_static"또는 "gnustl_shared"를 모듈의 gradle 파일에 추가 한 후 필요한 추가 단계가 있습니까?
SideLobe

4

세바스찬도 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

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


"same jni folder"라고 말하면 안드로이드 프로젝트의 jni 폴더를 말하는 것입니까? 알아 두어야 할 다른 위치가 없는지 확인하고 싶습니다. 참고 : 좋은 공유 링크는 이제 죽었습니다 :(
Hunter-Orionnoir

4

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 소스 파일 에는 오류가 없습니다 .


3

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


1

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

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

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


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.