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-build
Sebastian이 게시 한 코드를 추가 한 후 명령 줄에서 사용하여 프로젝트를 컴파일 할 수 있습니다 . 그러나 저에게는 Eclipse에 구문 오류가 있었고 코드 완성이 없었습니다.
프로젝트는 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...")
이전에 정의 된 모든 포함 디렉토리를 보이지 않게합니다. 이 줄을 제거 / 리팩토링하면 모든 것이 잘 작동합니다.