2014-07-24 2 views
0

앱에 기본 코드로 ndk-build이있는 namespace 오류가 발생했습니다. 오류 샘플 OpenCV의 설정에 대한Android 앱 개발을위한 기본 코드에서 opencv 사용

C:/adt-bundle-windows-x86/ndk/sources/cxx-stl/gnu-libstdc++/4.6/include/bits 
/allocator.h:54:1: error: unknown type name 'namespace' 
C:/adt-bundle-windows-x86/ndk/sources/cxx-stl/gnu-libstdc++/4.6/include/bits 
/allocator.h:55:1: error: expected ',' or ';' before '{' token 

입니다, 내 Application.mk 파일은 내가 네이티브 코드를 컴파일에 gnu-libstdc++을 사용하고 의미

APP_STL := gnustl_static 
APP_CPPFLAGS := -frtti -fexceptions 
APP_ABI := armeabi 
APP_PLATFORM := android-10 

입니다.

jni.cc extension입니다. 그것은 내 제 3 자로부터 받고 그들이 .cpp extension으로 변경해야하는 것처럼 .c extension에서 선호하기 때문에 다른 라이브러리에서 많이 변경해야합니다.

지금까지 OK입니다. OpenCV의 기본 개발 용 프로젝트 설정을 모두했는데 ndk-build을 수행하면 .so 라이브러리를 만들 수 있습니다.

namespace error의 문제점은 jni.c에 OpenCV's 헤더 파일 #include <opencv2/contrib/detection_based_tracker.hpp>을 포함 시켰을 때 많은 이름 공간 오류가 발생했습니다. #include <opencv2/contrib/detection_based_tracker.hpp>cpp 파일에 포함 시키면 오류가 발생하지 않습니다. 내 질문은

(1) .c 파일의 .hpp 파일 사용으로 인한 오류입니까?

(2) 선택의 여지가없고 .c 파일을 사용해야하는 경우 오류를 제거 할 수있는 방법이 있습니까? 감사합니다.

답변

1

내 생각에 파일은 확장명 ".c"로 인해 "C++"파일 대신 "C"파일로 컴파일됩니다. 이는 클래스 나 네임 스페이스와 같은 jni.c에서 "C++"코드를 사용할 수 없다는 것을 의미합니다. 그러나 이는 사용중인 "detect_based_tracker.hpp"파일에서 분명히 사용됩니다.

".hpp"라는 파일을 포함하는 것이 아니라 "C"컴파일러가 처리 할 수없는 "C++"코드가이 파일에 포함되어있는 것이 아닙니다.

"opencv2/imgproc/imgproc.hpp"대신 "opencv2/imgproc/imgproc_c.h"와 같이 opencv에서 "C"기능 만 사용하면됩니다. 그러나 "detect_based_tracker.hpp"함수에는 "C"버전이 없을 수도 있습니다.

다른 옵션은 opencv를 사용하는 "C++"함수와 함께 두 번째 파일 "function.cpp"를 추가하는 것입니다. "function.cpp"의 함수는 "functions.h"파일에 선언되어 "jni.c"에 포함될 수 있으므로 opencv C++ 함수를 계속 사용할 수 있습니다. "function.h"파일에 C 스타일의 함수 (클래스, 네임 스페이스, ... 등) 만 사용하도록주의하십시오. 그렇지 않으면 이전과 같은 문제가 발생합니다.