Unity 调用java代码 以及java回调

Unity版本2018.2.17  , 直接支持java代码,所以我在使用的时候没有打包成aar。

基本都是固定的代码 

AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");   //固定的,获取UnityPlayer类
        currentActivity = jc.GetStatic<AndroidJavaObject>("currentActivity");   //通过UnityPlayer类,获取Activity


        AndroidJavaClass launcher = new AndroidJavaClass("java类名(包名加类名)");      //获取java类

        AndroidJavaObject appController = launcher.CallStatic<AndroidJavaObject>("Instance"); //获取java类的实例 和unity单例一样,这是自己写的

      AndoridInterface callback = new AndoridInterface(callbackClass);


       appController.Call("Init", currentActivity, callback);  //初始化java类,把activity传进去,很多android方法调用都要用到,callback是一个回调,就是java调用Unity要用到的

 

AndoridInterface这个类主要就是java回调使用,必须继承AndroidJavaProxy,这是Unity写好的。构造函数中传入java代码

中对应的类名。这个类的函数和AndoridInterface的函数要一致,Unity会通过类名来回调。如果java要传参,函数的参数也要一致,java类用AndroidJavaObject代替。


 

public class AndoridInterface : AndroidJavaProxy {
    public Action<AndroidJavaObject> javaObjectCallBack;

    public Action<string> stringCallBack;

    public Action<int> intCallBack;

    public Action<float> floatCallBack;

    public Action<byte[]> byteCallBack;

    public Action<string> debugCallBack;

    public Action<bool> boolCallBack;

    public AndoridInterface(string interfaceName) : base(interfaceName)
    {

    }

    public void JavaObjectCallBack(AndroidJavaObject _data)
    {
        if (javaObjectCallBack != null)
            javaObjectCallBack(_data);
    }

    public void BoolCallBack(bool _data)
    {
        if (boolCallBack != null)
            boolCallBack(_data);
    }

    public void StringCallBack(string _data)
    {
        if (stringCallBack != null)
            stringCallBack(_data);
    }

    public void IntCallBack(int _data)
    {
        if (intCallBack != null)
            intCallBack(_data);
    }

    public void FloatCallBack(float _data)
    {
        if (floatCallBack != null)
            floatCallBack(_data);
    }

    public void ByteCallBack(byte[] _data)
    {
        if (byteCallBack != null)
            byteCallBack(_data);
    }

    public void DebugCallBack(string _data)
    {
        if (debugCallBack != null)
            debugCallBack(_data);
    }
}

这是java对应的回调接口,如果要在java中回调,就直接调用这个接口的函数就可以

public interface CallUnity {
    public  void JavaObjectCallBack(Object _data);

    public  void StringCallBack(String _data);

    public  void IntCallBack(int _data);

    public  void FloatCallBack(float _data);

    public  void FloatArryCallBack(float[] _data);

    public  void ByteCallBack(byte[] _data);

    public  void BoolCallBack(boolean _data);

    public void DebugCallBack(String _data);
}

这是java的Init函数

@Override
   public  void  Init(Context context , CallUnity callback)
   {

 

  }

 

整个代码因为自己封装了一下,所以感觉不太明了。

 java类.Call<返回类型>("函数名");    Unity如果调用java类就是这种格式

也可以   java类.CallStatic<返回类型>("函数名");  

返回类型byte[]的时候,我这里总是有问题,我看文档说是支持,但是我测试有问题。所以数组我全部用一个java类,类里面用一个集合来保存。Unity得到AndroidJavaObject,可以通过CallStatic遍历这个类的集合,然后取出数据。

整体来说调用挺简单,也挺方便的。

 

 

 

 

©️2020 CSDN 皮肤主题: 我行我“速” 设计师:Amelia_0503 返回首页