Unity在Android和iOS中如何调用Native API (1)
2012-05-20 19:52
363 查看
本文主要是对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. 如何打开webview
由于从C#调用C++的接口,需要在C++层分别给出相应的接口实现,如下所示:
★ Android 平台
★ iOS平台
本例运行时的截图如下所示:
![](http://img1.51cto.com/attachment/201205/185023774.png)
本文出自 “Roket的空间” 博客,请务必保留此出处http://roketruan.blog.51cto.com/5114948/870457
首先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 接口的引用声明是不一样的。本例对应的接口声明如下:
public class CallNativeAPI { #if UNITY_EDITOR public static void OpenWebView(string url) { return; } public static void SumNum(int v1, int v2) { TestUnityEditor.SumNum(v1, v2); return; } #elif UNITY_IPHONE [DllImport ("__Internal")] public static extern void OpenWebView(string url); [DllImport ("__Internal")] public static extern void SumNum(int v1, int v2); #elif UNITY_ANDROID [DllImport ("libtestunity", CallingConvention = CallingConvention.Cdecl)] public static extern void OpenWebView(string url); [DllImport ("libtestunity", CallingConvention = CallingConvention.Cdecl)] public static extern void SumNum(int v1, int v2); #endif public static void SumNumForResult(int v1, int v2, CallbackManager.ResultCallback callback) { TestCallbackManager.sumNumCallback.SetResultCallBack(new CallbackManager.ResultCallback(callback)); SumNum(v1, v2); return; } } namespace CallbackManager { public delegate void ResultCallback(int result); public class SumNumManager{ public SumNumManager() { } private ResultCallback resultCallback; public void SetResultCallBack(ResultCallback callback) { resultCallback = callback; } public void SendResult(int result) { resultCallback(result); } } } public class TestCallbackManager { public static CallbackManager.SumNumManager sumNumCallback = new CallbackManager.SumNumManager(); }
1. 如何打开webview
由于从C#调用C++的接口,需要在C++层分别给出相应的接口实现,如下所示:
★ Android 平台
extern "C" { void OpenWebView(const char *url){ __android_log_print(ANDROID_LOG_INFO, "TestUnity", "START ; invoking OpenWebView() = %s", url); JNIEnv *env = getJNIEnv(); initJni(env); jmethodID mid = env->GetStaticMethodID(jniClass, "OpenWebView", "(Ljava/lang/String;)V"); if (env->ExceptionCheck()) { env->ExceptionDescribe(); } jstring openUrl = (env)->NewStringUTF(url); env->CallStaticVoidMethod(jniClass, mid, openUrl); if (env->ExceptionCheck()) { env->ExceptionDescribe(); } __android_log_print(ANDROID_LOG_INFO, "TestUnity", "END ; invoking OpenWebView()"); return; } }
★ iOS平台
#ifdef __cplusplus extern "C" { #endif void OpenWebView(const char* url) { std::string webUrl(url); WebviewController::getInstance()->loadURL(webUrl).show(); return; } #ifdef __cplusplus } #endif
本例运行时的截图如下所示:
![](http://img1.51cto.com/attachment/201205/185023774.png)
本文出自 “Roket的空间” 博客,请务必保留此出处http://roketruan.blog.51cto.com/5114948/870457
相关文章推荐
- Unity在Android和iOS中如何调用Native API
- Unity在Android和iOS中如何调用Native API (2)
- Unity在Android和iOS中如何调用Native API (1)
- Unity在Android和iOS中如何调用Native API
- Unity在Android和iOS中如何调用Native API (2)
- Unity调用Android与IOS平台代码
- Unity调用原生(iOS, Android)方法
- [Unity2d系列教程] 004.Unity如何调用ios的方法(SDK集成相关)
- Unity引擎编译后的程序是如何运行在iOS和Android上
- [Unity2d系列教程] 003.Unity如何调用android的方法
- 如何使用友盟 Cocos2d-x 分享组件实现 Android/iOS 分享功能
- android 如何调用(打开)其他程序
- Android开发中如何调用摄像头的功能
- Android——网络交互,如何调用接口并且json解析json格式和pull解析xml格式
- Android HAL是如何被调用的
- Android深入浅出系列之实例应用—如何在一个Activity里调用另外一个Activity?
- 关于Unity程序在IOS和Android上显示内嵌网页的方式
- 高版本Android如何利用反射调用系统隐藏的远程服务拦截来电
- android应用程序如何调用支付宝接口
- Unity调用高德地图API,获取定位信息(Android)