本文主要是对unity中如何在Android和iOS中调用Native API进行介绍。
首先unity支持在C#中调用C++ dll,这样可以在Android和iOS中提供C++接口在unity中调用。利用这一特性,可以扩展unity的功能。例如集成和调用第三方库。同时为了满足对unity接口的一致性,可以考虑在android和iOS上提供相同的接口供C#调用。
这里列举以下两个例子。
1. 1. 以弹出一个覆盖部分屏幕的webview为例来说明如何从C#调用Native接口。
2. 2. 简单的C# -> C++ -> Java/ObjC -> C#的异步回调实现(会在下一期中给出实现)
由于android和iOS平台加载库的方式不同(android为动态加载,iOS为静态加载),在C#中针对不同平台对dll 接口的引用声明是不一样的。本例对应的接口声明如下:
1 public class CallNativeAPI { 2 3 #if UNITY_EDITOR 4 public static void OpenWebView(string url) { 5 return; 6 } 7 8 public static void SumNum(int v1, int v2) { 9 TestUnityEditor.SumNum(v1, v2); 10 11 return; 12 } 13 #elif UNITY_IPHONE 14 [DllImport ("__Internal")] 15 public static extern void OpenWebView(string url); 16 [DllImport ("__Internal")] 17 public static extern void SumNum(int v1, int v2); 18 #elif UNITY_ANDROID 19 [DllImport ("libtestunity", CallingConvention = CallingConvention.Cdecl)] 20 public static extern void OpenWebView(string url); 21 [DllImport ("libtestunity", CallingConvention = CallingConvention.Cdecl)] 22 public static extern void SumNum(int v1, int v2); 23 #endif 24 25 public static void SumNumForResult(int v1, int v2, CallbackManager.ResultCallback callback) { 26 27 TestCallbackManager.sumNumCallback.SetResultCallBack(new CallbackManager.ResultCallback(callback)); 28 29 SumNum(v1, v2); 30 31 return; 32 } 33 } 34 35 namespace CallbackManager 36 { 37 public delegate void ResultCallback(int result); 38 39 public class SumNumManager{ 40 public SumNumManager() 41 { 42 } 43 44 private ResultCallback resultCallback; 45 46 public void SetResultCallBack(ResultCallback callback) 47 { 48 resultCallback = callback; 49 } 50 51 public void SendResult(int result) 52 { 53 resultCallback(result); 54 } 55 } 56 } 57 58 public class TestCallbackManager { 59 60 public static CallbackManager.SumNumManager sumNumCallback = new CallbackManager.SumNumManager(); 61 62 }
转载至: