[유니티] 이슈 정리

프로그래밍/유니티2018. 4. 9. 20:59

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



안드로이드 스튜디오에서 cpp코드로 .so파일을 만든 다음에

이를 유니티에서 플러그인으로 가져와 apk를 만들고 

이 apk에서 cpp의 코드를 잘 호출하는지 테스트해봤습니다. 


그 과정에서 발생한 문제 정리합니다.


1. EntryPointNotFoundException 

만약 안드로이드 스튜디오에서 로그캣을 통해 로그를 확인했을 때 EntryPointNotFoundException이 발생한다면

so를 소스가 되는 cpp파일을 확인해봐야 합니다.


native-lib.cpp

1
2
3
extern "C"{
    float FooPluginFunction() { return 5.0f;}
}
cs

apk에서 테스트로 사용할 cpp의 함수는 extern "C"{} 코드로 감싸야 합니다.


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 as OLE32.DLL. Linux platforms use a lib prefix and a .so suffix(see Note 1). Mac OS X platforms have a lib 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")]이라고 하면 잘 동작합니다.


작성자

Posted by 드리머즈

관련 글

댓글 영역