本文主要是对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. publicclassCallNativeAPI{
  2. #ifUNITY_EDITOR
  3. publicstaticvoidOpenWebView(stringurl){
  4. return;
  5. }
  6. publicstaticvoidSumNum(intv1,intv2){
  7. TestUnityEditor.SumNum(v1,v2);
  8. return;
  9. }
  10. #elifUNITY_IPHONE
  11. [DllImport("__Internal")]
  12. publicstaticexternvoidOpenWebView(stringurl);
  13. [DllImport("__Internal")]
  14. publicstaticexternvoidSumNum(intv1,intv2);
  15. #elifUNITY_ANDROID
  16. [DllImport("libtestunity",CallingConvention=CallingConvention.Cdecl)]
  17. publicstaticexternvoidOpenWebView(stringurl);
  18. [DllImport("libtestunity",CallingConvention=CallingConvention.Cdecl)]
  19. publicstaticexternvoidSumNum(intv1,intv2);
  20. #endif
  21. publicstaticvoidSumNumForResult(intv1,intv2,CallbackManager.ResultCallbackcallback){
  22. TestCallbackManager.sumNumCallback.SetResultCallBack(newCallbackManager.ResultCallback(callback));
  23. SumNum(v1,v2);
  24. return;
  25. }
  26. }
  27. namespaceCallbackManager
  28. {
  29. publicdelegatevoidResultCallback(intresult);
  30. publicclassSumNumManager{
  31. publicSumNumManager()
  32. {
  33. }
  34. privateResultCallbackresultCallback;
  35. publicvoidSetResultCallBack(ResultCallbackcallback)
  36. {
  37. resultCallback=callback;
  38. }
  39. publicvoidSendResult(intresult)
  40. {
  41. resultCallback(result);
  42. }
  43. }
  44. }
  45. publicclassTestCallbackManager{
  46. publicstaticCallbackManager.SumNumManagersumNumCallback=newCallbackManager.SumNumManager();
  47. }

1. 如何打开webview

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

Android 平台

        
  1. extern"C"{
  2. voidOpenWebView(constchar*url){
  3. __android_log_print(ANDROID_LOG_INFO,"TestUnity","START;invokingOpenWebView()=%s",url);
  4. JNIEnv*env=getJNIEnv();
  5. initJni(env);
  6. jmethodIDmid=env->GetStaticMethodID(jniClass,"OpenWebView","(Ljava/lang/String;)V");
  7. if(env->ExceptionCheck()){
  8. env->ExceptionDescribe();
  9. }
  10. jstringopenUrl=(env)->NewStringUTF(url);
  11. env->CallStaticVoidMethod(jniClass,mid,openUrl);
  12. if(env->ExceptionCheck()){
  13. env->ExceptionDescribe();
  14. }
  15. __android_log_print(ANDROID_LOG_INFO,"TestUnity","END;invokingOpenWebView()");
  16. return;
  17. }
  18. }

iOS平台

        
  1. #ifdef__cplusplus
  2. extern"C"{
  3. #endif
  4. voidOpenWebView(constchar*url){
  5. std::stringwebUrl(url);
  6. WebviewController::getInstance()->loadURL(webUrl).show();
  7. return;
  8. }
  9. #ifdef__cplusplus
  10. }
  11. #endif

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

更多相关文章

  1. android java 分享功能实现,Cocos2d-x3.3RC0通过JNI调用Android
  2. Android应用程序的开发
  3. Android源码分析之WindowManager.LayoutParams属性更新过程
  4. Android音视频处理技术 视频录制
  5. 深入浅出 - Android系统移植与平台开发(六)- 为Android启动加速
  6. Android调用系统相机、自定义相机、处理大图片
  7. Mika Mobile 谈论 Android(安卓)游戏开发:一个吵闹而让人讨厌的孩
  8. Android屏幕锁定实例源码详解教程一
  9. 个人开发者如何通过Android应用赚外快[推荐给想赚外快的同学]

随机推荐

  1. [置顶] android adb adbd analyse
  2. Getting Android(安卓)Sensor Events Whi
  3. [Android(安卓)GMS 认证] CTS 问题列表之
  4. Android通知栏图标显示网络图片
  5. android studio 接入androidannotations
  6. android camera根据屏幕图像大小设置显示
  7. Android(安卓)数字格式化
  8. android自定义dialog样式
  9. Android(安卓)BaseAdapter基本使用及数据
  10. Android放大镜的实现