本文主要是对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. namespace CallbackManager 
  35.     public delegate void ResultCallback(int result); 
  36.      
  37.     public class SumNumManager{ 
  38.         public SumNumManager() 
  39.         { 
  40.         } 
  41.          
  42.         private ResultCallback resultCallback; 
  43.  
  44.         public void SetResultCallBack(ResultCallback callback) 
  45.         { 
  46.             resultCallback = callback; 
  47.         } 
  48.              
  49.         public void SendResult(int result) 
  50.         { 
  51.             resultCallback(result); 
  52.         } 
  53.     } 
  54.  
  55. public class TestCallbackManager { 
  56.  
  57.     public static CallbackManager.SumNumManager sumNumCallback = new CallbackManager.SumNumManager(); 
  58.      

 

1. 如何打开webview

由于从C#调用C++的接口,需要在C++层分别给出相应的接口实现,如下所示:

Android 平台

 
  1. extern "C" { 
  2. void OpenWebView(const char *url){ 
  3.         __android_log_print(ANDROID_LOG_INFO, "TestUnity""START ; invoking OpenWebView() = %s", url); 
  4.  
  5.         JNIEnv *env = getJNIEnv(); 
  6.         initJni(env); 
  7.  
  8. jmethodID mid = env->GetStaticMethodID(jniClass, "OpenWebView""(Ljava/lang/String;)V"); 
  9.  
  10.         if (env->ExceptionCheck()) { 
  11.             env->ExceptionDescribe(); 
  12.         } 
  13.  
  14.         jstring openUrl = (env)->NewStringUTF(url); 
  15.         env->CallStaticVoidMethod(jniClass, mid, openUrl); 
  16.  
  17.         if (env->ExceptionCheck()) { 
  18.             env->ExceptionDescribe(); 
  19.         } 
  20.  
  21.         __android_log_print(ANDROID_LOG_INFO, "TestUnity""END ; invoking OpenWebView()"); 
  22.         return
  23.     } 

 

iOS平台

 

 
  1. #ifdef __cplusplus 
  2. extern "C" { 
  3. #endif 
  4. void OpenWebView(const char* url) { 
  5.      
  6.     std::string webUrl(url); 
  7.     WebviewController::getInstance()->loadURL(webUrl).show(); 
  8.     return
  9. #ifdef __cplusplus 
  10. #endif 

本例运行时的截图如下所示: