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>(&#34;currentActivity&#34;);
}
//调用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(&#34;com.sdkmanager.SdkListener&#34;)
{
}
//原生层直接从游戏层 - 获取数据
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(&#34;com.unity3d.player.UnityPlayer&#34;);
jo = jc.GetStatic<AndroidJavaObject>(&#34;currentActivity&#34;);
}
//调用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(&#34;SDKAddListener&#34;,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]