本文原始来自 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主的代码,直接成功。我的天啊。。