yukamu 发表于 2022-9-16 20:04

Unity 中Android平台 C#怎么和java通信?

1、C#调用java接口
先上代码
public class SDKForAndroid
{
    private AndroidJavaObject jc;
    AndroidJavaObject jo;

    public SDKForAndroid()
    {
      AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
      jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
    }

    //调用java方法
    public void Call(string funcName, params object[] args)
    {
      try
      {
            if (jo != null)
            {
                jo.Call(funcName, args);
            }
      }
      catch (System.Exception e)
      {
            Log.Warning(e.Message);
      }
    }
}
在C#层主要用到了两个类AndroidJavaClass和AndroidJavaObject,传入包名和对象名就可以调用到java的接口了。
是不是很简单呢,嘿嘿
如果还想继续往深了挖的小伙伴可能会问,AndroidJavaClass和AndroidJavaObject底层是怎么调用到java的接口呢?其实本质上是对JNI的封装。
那什么是JNI呢?JNI是Java Native Interface的缩写,java 通过jni 就可以和C++层通信,有兴趣的小伙伴可以去网上搜索了解更多,如果有时间我也会再写一篇关于JNI的文章。

2、java调用C#接口
有两种方式
第一种方式
如果对Unity有些了解的同学肯定都知道一个接口,就是 UnitySendMessage ,然后传入组件的名字和方法的名字就可以调用了。
这种调用方式是线程安全的,但是可能会相对耗时一些,它的实现会遍历所有的transfrom然后找到相应的组件及方法进行调用。
第二种方式
先看C#层代码
public class AndroidSDKListener : AndroidJavaProxy
{
    public AndroidSDKListener() : base("com.sdkmanager.SdkListener")
    {
      
    }

    //原生层直接从游戏层 - 获取数据
    public object getDataFromGame(string funcName, string data)
    {
      
    }

    //原生层发送数据到游戏层
    public void SendDataToGame(string funcName, string data)
    {
      
    }
}
先定义AndroidJavaProxy 的对象,然后将该对象传给java层
public class SDKForAndroid
{
    private AndroidJavaObject jc;
    AndroidJavaObject jo;

    public SDKForAndroid()
    {
      AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
      jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
    }

    //调用java方法
    public void Call(string funcName, params object[] args)
    {
      try
      {
            if (jo != null)
            {
                jo.Call(funcName, args);
            }
      }
      catch (System.Exception e)
      {
            Log.Warning(e.Message);
      }
    }

    publicvoid AddListener()
    {
      Call("SDKAddListener",new AndroidSDKListener());
    }
}

然后再看java层代码
先定义一个和AndroidSDKListener 同样接口的代码
public interface SdkListener {
    public Object getDataFromGame(String funcName,String data);
    public void SendDataToGame(String funcName,String data);
}
C#调用AddListener() 后会触发java层下面这个接口
private SdkListener mSdkListener;
public void SDKAddListener(SdkListener listener) {
    mSdkListener = listener;
}
此时java层就可以根据 mSdkListener 对象给C#层发送数据和获取数据了。

相比两种方式,第二种调用方式较第一种调用方式更加高效,但不是线程安全的,如果需要线程安全的则要再加额外的代码。

好了,C#和java 之间的通信到这里就写完了,

那如果游戏中使用了lua,那lua又是如何和C#通信的呢?且听下回分解
页: [1]
查看完整版本: Unity 中Android平台 C#怎么和java通信?