本文原始来自 https://blog.csdn.net/BDDNH/article/details/100583822
版权声明:本文为CSDN博主「笔端的年华」的原创文章,遵循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主的代码,直接成功。我的天啊。。