[유니티/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(238, 244, 66)); Mat frame2 = Mat(x, y, CV_8UC4, z); cvtColor(frame2, frame, CV_RGBA2BGR, 4); threshold(frame, frame, 128, 128, 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(); *z = 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(238, 244, 66)); Mat frame2 = Mat(x, y, CV_8UC4, z); cvtColor(frame2, frame, CV_RGBA2BGR, 4); threshold(frame, frame, 128, 128, 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(); *z = NULL; return result; } | cs |
갈색 음영의 코드가 추가됐습니다. 아마 __declspec(dllexport) 코드가 중요한 것 같습니다.
이 사진은 수정한 dll의 내부를 본 사진입니다. 이번에는! Ocv_get_image 함수가 보입니다. 이 dll을 유니티 플러그인으로 사용하니 문제가 되던 EntryPointNotFoundException가 더이상 발생하지 않습니다~!!
댓글 영역