【转载】Unity 调用java代码 以及java回调

    技术2022-07-10  174

    本文原始来自 https://blog.csdn.net/BDDNH/article/details/100583822

    版权声明:本文为博主「笔端的年华」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。  

    感谢大神的辛勤研究和分享。

    ================以下是原文=====================

    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遍历这个类的集合,然后取出数据。

    整体来说调用挺简单,也挺方便的。 ———————————————— ================所以照例是要补点自己的废话。=================

    最近需要unity调用jar,结果网上一搜,就是出来一堆jar aar manifest xml啥的 结果 整了半天没弄上。各种编译错误倒是和blog里的如出一辙。但是按照他们的方法都没能解决。后来一看到这篇文章, 我直接生成一个jar,丢plugins/android目录下,然后直接用blog主的代码,直接成功。我的天啊。。

    Processed: 0.013, SQL: 9