마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

JNI 빌드에러 조언좀 부탁드립니다.

0 추천

JNI 를 활용하여 기존 만들어진 C++코드를 안드로이드 프로젝트에 넣는중인데 

빌드 과정에서 이런 오류가 뜨네요. 

C:/Android/android-ndk-r9c/toolchains/arm-linux-androideabi-4.6/prebuilt/windows-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld.exe: ./obj/local/armeabi-v7a/objs-debug/Make3DObject/com_IELab_project_make3dmodel_MainOperator.o: in function CSSensorModel::SetEOPara(double, double, double, double, double, double):jni/./Class_Sensor/SSensorModel.h:334: error: undefined reference to 'CFrmCamera::SetEOPara(double, double, double, double, double, double)'

C:/Android/android-ndk-r9c/toolchains/arm-linux-androideabi-4.6/prebuilt/windows-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld.exe: ./obj/local/armeabi-v7a/objs-debug/Make3DObject/com_IELab_project_make3dmodel_MainOperator.o: in function CSSensorModel::SetFrmCameraPara(double, double, int, int):jni/./Class_Sensor/SSensorModel.h:402: error: undefined reference to 'CFrmCamera::SetCameraPara(double, double, int, int)'

C:/Android/android-ndk-r9c/toolchains/arm-linux-androideabi-4.6/prebuilt/windows-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld.exe: ./obj/local/armeabi-v7a/objs-debug/Make3DObject/com_IELab_project_make3dmodel_MainOperator.o: in function MultiDimensionalMatching(int, std::vector<std::string, std::allocator<std::string> >*, std::vector<Point2DF, std::allocator<Point2DF> >*, std::vector<Point3DD, std::allocator<Point3DD> >*, std::vector<Point3DD, std::allocator<Point3DD> >*, std::basic_fstream<char, std::char_traits<char> >&):jni/com_IELab_project_make3dmodel_MainOperator.cpp:849: error: undefined reference to 'CSSensorModel::CSSensorModel(int)'

C:/Android/android-ndk-r9c/toolchains/arm-linux-androideabi-4.6/prebuilt/windows-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld.exe: ./obj/local/armeabi-v7a/objs-debug/Make3DObject/com_IELab_project_make3dmodel_MainOperator.o: in function MultiDimensionalMatching(int, std::vector<std::string, std::allocator<std::string> >*, std::vector<Point2DF, std::allocator<Point2DF> >*, std::vector<Point3DD, std::allocator<Point3DD> >*, std::vector<Point3DD, std::allocator<Point3DD> >*, std::basic_fstream<char, std::char_traits<char> >&):jni/com_IELab_project_make3dmodel_MainOperator.cpp:849: error: undefined reference to 'CSSensorModel::CSSensorModel(int)'

위와같은 오류가 수십줄이 나오네요..ㅠㅠ

찾아보니 라이브러리가 링크가 안되었다는 말씀들이 많은데 혹시나 해서 mk파일도 같이 올려봅니다

 

<Android.mk>

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)


OPENCV_INSTALL_MODULES:=on
OPENCV_CAMERA_MODULES:=off
OPENCV_LIB_TYPE:=STATIC

include C:/Workspace_FM/OpenCV246/sdk/native/jni/OpenCV.mk

LOCAL_MODULE    := Make3DObject
LOCAL_SRC_FILES := com_IELab_project_make3dmodel_MainOperator.cpp 3DMapper.cpp GDALImage.cpp ImageResampler.cpp MatchCandidate.cpp MDR.cpp MultyMatching.cpp RelativeOrientation.cpp SIFTbyHess.cpp SingleOrientation.cpp stdafx.cpp TezDatum.cpp ./Library/SIFTHess_r1.1.2/imgfeatures.cpp ./Library/SIFTHess_r1.1.2/kdtree.cpp ./Library/SIFTHess_r1.1.2/minpq.cpp ./Library/SIFTHess_r1.1.2/sift.cpp ./Library/SIFTHess_r1.1.2/utils.cpp ./Library/SIFTHess_r1.1.2/xform.cpp                             
#LOCAL_LDLIBS    += -lm -llog -landroid
LOCAL_LDLIBS    += -llog


include $(BUILD_SHARED_LIBRARY)

 

<Application.mk>

APP_STL := gnustl_static
APP_CPPFLAGS := -frtti -fexceptions -fpermissive -Wformat -Wwrite-strings
APP_ABI := armeabi-v7a
APP_PLATFORM := android-16

APP_OPTIM := debug
APP_CFLAG := -g -ggdb -O0 

여러가지 에러를 해결하는중 여기서 해결을 못하겠네요 ㅠㅠ 조언 부탁드립니다.

 

 

익명사용자 님이 2015년 5월 29일 질문

1개의 답변

0 추천
음 이거 머라 말씀드려야할지. 이건 그냥 찾아보신대로 라이버러리의 링크정상적이지 않을대 나오는 메세지들인데요....

첫번째 에러라인만 보더라두요

undefined reference to .... 이라고 나오자나요, 참조하는것이 정의 되어 있지않다. 해당하는 함수를 실제로 쓸려고 보니 함수가 없더라 이런말이거든요.

c/c++ 언어의 특징상  h 와 cpp 파일로 구현들이 되어지는데 h는 정의만 담고 있고 실제 구현은 cpp에서 많이들 하죠.

즉 정의 하는 곳따로 실체를 구현하는 곳 따로 나누어 진 것이 c/c++의 특징이라 정의만 있다면 일단은 링크하기전까진 에러가 나지 않습니다.

실제 링크과정에 들어가게되면 정의만 보고 만들것들을 실체와 연결시켜주는 작업을 하게 되는데 이떼 실체가 없다면

undefined reference to ... 과 같은 에러를 출력해주지요.

좀더 보자면

첫번째 줄은 CFrmCamera 라는 클래스에 SetEOPara 라는 함수가 있어야 하는데  그함수가 실제로 없다는 것입니다.

여기서 setEOPara 함수는 6개의 더블 인자를 파라메터로 받는 함수여야 하는 거죠.

아무튼 그함수가 없다는데 그렇다면 실제 그함수가 있는 cpp파일이나 라이버러리를 android.mk  파일에 같이 넣어 주셔야만 정상적으로 링크가 가능해 질듯 보입니다.

아무튼 에러 로그 보시면서 실제 함수가 어디서 정의 되었는지 알아보시고 빠진부분들을 추가 해주셔야만 해결 됫 듯 합니다.

한가지 Android.mk 파일을 볼때 opencv  를 라이버러리로 사용하시는듯 한데요.

저기 opencv 라이버러리의 위치가 정확한지도 확인하시고. opnecv 라이버러리 파일이 정상적으로 로드돼고있는지도 확인하셔야할 듯하네요
컴러기 (22,230 포인트) 님이 2015년 5월 29일 답변
말씀하신내용 읽어보니 제가 mk 파일에 추가하지 않은 cpp파일이 있었습니다.

추가 하니 그 부분을 잘 넘어가네요 감사합니다
...