找回密码
 立即注册
查看: 234|回复: 0

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

[复制链接]
发表于 2022-9-16 20:04 | 显示全部楼层 |阅读模式
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);
        }
    }

    public  void 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#通信的呢?且听下回分解
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-7-2 09:13 , Processed in 0.080944 second(s), 22 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表