[유니티] 이슈 정리
안녕하세요. 개발자 드리머즈입니다.
안드로이드 스튜디오에서 cpp코드로 .so파일을 만든 다음에
이를 유니티에서 플러그인으로 가져와 apk를 만들고
이 apk에서 cpp의 코드를 잘 호출하는지 테스트해봤습니다.
그 과정에서 발생한 문제 정리합니다.
1. EntryPointNotFoundException
만약 안드로이드 스튜디오에서 로그캣을 통해 로그를 확인했을 때 EntryPointNotFoundException이 발생한다면
so를 소스가 되는 cpp파일을 확인해봐야 합니다.
native-lib.cpp
1 2 3 | extern "C"{ float FooPluginFunction() { return 5.0f;} } | cs |
2. DllNotFoundException
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using System.Runtime.InteropServices; public class interOpTest : MonoBehaviour { [DllImport("native-lib")] private static extern float FooPluginFunction(); // Use this for initialization void Start () { print(FooPluginFunction()); } // Update is called once per frame void Update () { } } | cs |
유니티에서 위 코드와 같이 스크립트를 생성한 다음에 유니티에서 실행을 시키면 아래와 같은 에러가 발생합니다.
안드로이드를 위해 생성된 so파일은 유니티에서 사용하지 못한다고 합니다.
그래서 유니티에서 apk를 생성하고 안드로이드 단말에 이 apk를 설치해서 테스트 해야합니다.
(참고 : http://www.devkorea.co.kr/bbs/board.php?bo_table=m03_qna&wr_id=3337)
그런데 이렇게하면.. 테스트에 시간이 너무 많이 걸려서 다른 방법이 없나 찾아봐야겠습니다.
3. DllImport()안에 어떤 함수 이름을 줘야할까?
타겟 플렛폼에 따라 라이브러리의 이름 규칙이 다릅니다.
Different platforms have different naming conventions. Windows platforms append
.DLL
to the library name, such asOLE32.DLL
. Linux platforms use alib
prefix and a.so
suffix(see Note 1). Mac OS X platforms have alib
prefix and a.dylib
suffix, unless they’re a Framework, in which case they’re a directory and things get more complicated.
참고 : http://www.mono-project.com/docs/advanced/pinvoke/#library-handling
어쨋든 안드로이드/리눅스?에서 so파일의 이름이 libnative-lib.so라면 [DllImport("native-lib")]이라고 하면 잘 동작합니다.
댓글 영역