编写本文是因为找了很多文章,都比较片段,不容易理解,对于Android新手来说理解起来不友好。我这里写了一个针对比较小白的文章,希望有所帮助。
Android端
首先还是先来写Android端,我们新建一个Android空项目,并添加一个Module,具体可以参考这篇《Unity 编写自己的aar库,并通过AndroidJavaProxy调用访问和返回》,我们给Module命名AndroidJFramework,还是一个Library类型。
添加Unity Jar
因为要给Unity传送消息,要使用到UnityPlayer类,所以我们需要把Unity的Lib复制到安卓里,我这里使用的2022.3.17,路径是\Unitys\2022.3.17f1c1\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Release\Classes

 
我们回到Android,建立了Libs目录并把这个jar复制到安卓的项目里,重命名为calsses_unity.jar
 如下图:
 
 
 添加了新库,要在build.gradle中添加引用
implementation files('src\\Libs\\classes_unity.jar')
 
或者还可以在这个jar上点击右键,进行添加
 如下图:
 
 
 
 这样gradle文件中会自动添加,如下图:
 
 
 最后改完gradle文件,记得sync一下,在菜单的File->Sync Project with Gradle Files

前期工作做完了,然后我们开始编写Android脚本。
编写Android脚本
我们这里编写两个类
package com.lg.AndroidJFramework;
public interface UnityBroadcasterInterface {
    void onReceive(String action,String msg);
}
 
这个UnityBroadcasterInterface是一个interface,因为Unity只能访问interface。
package com.lg.AndroidJFramework;
import android.content.Context;
import com.unity3d.player.UnityPlayer;
import android.content.BroadcastReceiver;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.util.Log;
public class UnityBroadcaster
{
    public UnityBroadcasterInterface mInterface;
    //广播处理并回调Unity中OnReceive()方法
    private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            Log.d("test", "UnityBroadcastHelper: action: " + action);
            Bundle bundle = intent.getExtras();
            if (bundle == null) {
                bundle = new Bundle();
            }
            int n = bundle.size();
            int i = 0;
            String parm = "";
            for (String key : bundle.keySet()) {
                Object value = bundle.get(key);
                String omsg = String.format("{ \"%s\" : \"%s\" , \"%s\" : \"%s\" }","id",key,"value",value.toString());
                parm += omsg;
                i++;
                if(i < n)
                    parm += ",";
            }
            parm = "{\"data\":["+parm+"]}";
            mInterface.onReceive(action,parm);
        }
    };
    //构造函数
    public UnityBroadcaster(UnityBroadcasterInterface callback)
    {
        mInterface = callback;
        Context context = UnityPlayer.currentActivity;
        if (context == null) {
            Log.e("test","找不到Unity");
            return;
        }
        IntentFilter ifs = new IntentFilter();
        ifs.addAction("com.lg.updateandroid");
        context.registerReceiver(broadcastReceiver, ifs);
    }
}
 
这个UnityBroadcaster类是负责接收广播,并把广播通过mInterface.onReceive(action,parm)传递给Unity。
 IntentFilter是广播的过滤,改成你的自定义名称。接收到的广播消息,我拼接成了json格式数据传递给Unity。
最后我们就可以进行编译了。
编译

 我们点击Make Module,运行完成后我们来到build目录就可以找到aar文件。我的是在
 E:\AndroidProjects\AndroidJFrameWork\AndroidJFramework\build\outputs\aar
 
 我们把这个文件复制到Unity项目Plugins\Android目录下。
 如下图位置:
 
这里我们要进行一个操作,用Winrar把aar文件打开,把Libs里的unity.jar删除掉
 
 如果没有删除我们在打包的时候可能会出现如下报错:
 Duplicate class bitter.jnibridge.JNIBridge found in modules AndroidJFramework-debug-runtime

 提示我们有重复的类JNIBridge .
到这里Android部分就完成了,看起来一大堆操作,其实还是挺简单的。
Unity端
主脚本
Unity里我们也是添加两个脚本。
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class UnityBroadcaster : AndroidJavaProxy
{
    [Serializable]
    public class RecData
    {
        public string id;
        public string value;
    }
    [Serializable]
    public class RecDataList
    { 
        public RecData[] data;
    }
    AndroidJavaObject javaObject;
    public UnityBroadcaster() : base("com.lg.AndroidJFramework.UnityBroadcasterInterface")
    {
        javaObject = new AndroidJavaObject("com.lg.AndroidJFramework.UnityBroadcaster", this);
    }
    public void onReceive(string action,string msg)
    {
        RecDataList list = new RecDataList();
        Debug.Log("Unity onReceive :" + action + msg);
        list = JsonUtility.FromJson<RecDataList>(msg);
        for (int i = 0; i < list.data.Length; i++)
        {
            RecData data = list.data[i];
            Debug.Log(data.id + " : " + data.value);
        }
    }
}
 
我们建立主脚本UnityBroadcaster ,继承自AndroidJavaProxy。构造函数我们这里的base后面就是包名+interface的名称,例如我的是com.lg.AndroidJFramework.UnityBroadcasterInterface。
javaObject是实例化这个Java对象,需要用包名+类名,例如我的是com.lg.AndroidJFramework.UnityBroadcaster
这两个名称绝对不能错误,请自定修改。
实例化脚本
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using static UnityBroadcaster;
public class BroadcasterLoad : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        new UnityBroadcaster();
    }
}
 
AndroidJavaProxy脚本没办法挂在对象上,所以我们建立一个脚本,直接new,挂在主场景对象上。
 然后直接进行Unity打包就可以了。
测试
我是从另外一个app上发送的广播,不在本例arr安卓端,你可以自行建立一个带窗体按钮的app,点击按钮发送广播就可以了。
Intent intent=new Intent();
intent.setAction("com.lg.updateandroid");//广播的名字,过滤使用
intent.putExtra("msg1", "haha1");//指定广播内容
intent.putExtra("msg2", "hehe1");//指定广播内容
mContext.sendBroadcast(intent); //发送广播
 
发送广播后我们可以看到输出的内容:
 
参考
https://www.programmersought.com/article/51956081045/
 https://vuopaja.com/tutorials/android-java-proxy



















