[유니티/OpenCV]EntryPointNotFoundException

프로그래밍/유니티2018. 4. 11. 22:06

안녕하세요. 개발자 드리머즈입니다.

유니티 개발중 발생한 이슈 정리합니다.



EntryPointNotFoundException: ocv_get_image ExampleTest.Update () (at Assets/ExampleTest.cs:45)



유니티 C#에서 dll의 함수 ocv_get_image를 호출할 때 발생한 에러입니다. 


dll을 만든 원본 c++소스에서 ocv_get_image는 아래와 같이 정의되어 있었습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
extern "C" char* ocv_get_image(int x, int y, char* z){
 
    Mat frame(x, y, CV_8UC3, Scalar(23824466));
    Mat frame2 = Mat(x, y, CV_8UC4, z);
    cvtColor(frame2, frame, CV_RGBA2BGR, 4);
    threshold(frame, frame, 128128, THRESH_BINARY);
    cvtColor(frame, frame, CV_BGR2RGBA, 4);
    char* result;
    result = new char[frame.cols*frame.rows * 4];
    memcpy(result, frame.data, frame.cols*frame.rows * 4);
    frame.release();
    frame2.release();
    *= NULL;
 
    return result;
}
cs


도전1 -> 실패

dll(C++)과 C#코드에서 ocv_get_image를 Ocv_get_image로 변경해본다. -> 이슈 해결되지 않음


도전2 -> 성공

dll 내부 구조를 볼 수 있는 Dependency Walker(http://www.dependencywalker.com/)를 다운받아 dll을 내부를 봤습니다.

위 사진은 Ocv_get_image 함수를 못찾는 dll의 사진입니다. 사진의 중앙에 표시한 빨간색 네모에 Ocv_get_image가 없습니다.


dll(C++)의 Ocv_get_image의 접근 인자?를 아래와 같이 수정해보겠습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
extern "C" __declspec(dllexport) char* __stdcall Ocv_get_image(int x, int y, char* z){
 
    Mat frame(x, y, CV_8UC3, Scalar(23824466));
    Mat frame2 = Mat(x, y, CV_8UC4, z);
    cvtColor(frame2, frame, CV_RGBA2BGR, 4);
    threshold(frame, frame, 128128, THRESH_BINARY);
    cvtColor(frame, frame, CV_BGR2RGBA, 4);
    char* result;
    result = new char[frame.cols*frame.rows * 4];
    memcpy(result, frame.data, frame.cols*frame.rows * 4);
    frame.release();
    frame2.release();
    *= NULL;
 
    return result;
}
cs

갈색 음영의 코드가 추가됐습니다. 아마 __declspec(dllexport) 코드가 중요한 것 같습니다.


이 사진은 수정한 dll의 내부를 본 사진입니다. 이번에는! Ocv_get_image 함수가 보입니다. 이 dll을 유니티 플러그인으로 사용하니 문제가 되던 EntryPointNotFoundException가 더이상 발생하지 않습니다~!!



작성자

Posted by 드리머즈

관련 글

댓글 영역