2015년 4월 15일 수요일

Unity3D에서 Native 함수 호출

AOS
private AndroidJavaClass unityPlayerClass;
private AndroidJavaObject unityPlayerActivity;

void Awake()
{
    unityPlayerClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
    unityPlayerActivity = unityPlayerClass.GetStatic<AndroidJavaObject>("currentActivity");
}
  • "currentActivity"로 접근해서 얻는 이유.
    Call 함수의 엔진 내부 동작은 달빅VM 쓰레드에 연결된 jnienv의 포인터를 받은 후 GetMethodID 함수를 통해 스트링으로 제공하는 함수 이름에 맞는 함수의 ID를 찾아 실행시켜 줍니다.
    매번 GetMethodID를 호출하여 ID를 찾으면 시간이 걸리니 엔진 내부에서는 캐싱 테이블로 빠르게 ID를 찾을 수 있게 제공합니다.
    따라서 Call 함수를 부모 클래스의 레퍼런스상에서 호출하더라도 C#의 Reflection 처럼 동작하여 문제 없이 EclipseBasicActivity의 함수를 호출할 수 있게 됩니다.
    http://unitystudy.net/bbs/board.php?bo_table=qanda&wr_id=174
  • Destroy할때 Dispose 해주자.
    void OnDestroy()
    {
        if (unityPlayerActivity != null)
        {
           unityPlayerActivity.Dispose();
           unityPlayerActivity = null;
        }
    
        if (unityPlayerClass != null)
        {
            unityPlayerClass.Dispose();
            unityPlayerClass = null;
        }
    }
    
  • Native 메소드 호출 방법
    // (void func0())
    unityPlayerActivity.Call("func0");
    // (void func1(string msg))
    unityPlayerActivity.Call("func1", "message");
    // (void func2(int val))
    unityPlayerActivity.Call("func2", value);
    // (bool func3())
    boo bRet = unityPlayerActivity.Call<bool>("func3");
    

IOS
using System.Runtime.InteropServices; // 선언

[DllImport("__Internal")]
private static extern void func1();

[DllImport("__Internal")]
private static extern int func2();
  • 다른 플러그인 시스템과 마찬가지로 C#과 네이티브 코드는 다른 영역이며, C#에서 네이티브를 호출할 때에는 .NET의 PInvoke 기능을 사용하고, 네이티브에서는 유니티 라이브러리에서 제공하는 UnitySendMessage를 사용하여 C#의 함수를 호출합니다.
    PInvoke를 사용하기 위해서는 System.Runtime.InteropServices 네임스페이스를 사용해야하며, [DllImport(“__Internal”)] 프로퍼티를 C#의 static 멤버 함수에 설정하면 Objective C 코드에서 선언된 함수와 일치하게 됩니다.
    이 때 Objective C 코드의 함수는 C 스타일로 정의되어야 하며, 이를 위해 함수에 extern “C”키워드를 명시적으로 주어 name mangling 문제가 일어나지 않도록 합니다.
    http://www.unitystudy.net/bbs/board.php?bo_table=dustin&wr_id=402 // [모바일] iOS 플러그인 제작


댓글 없음:

댓글 쓰기