Unity2021通过aar调用Android方法

开发环境:Android Studio Dolphin | 2021.3.1 Patch 1、Unity2021.3.35f1

本方法无需复制Unity的class.jar到Android Studio工程,java代码也无需获取UnityActivity。

可参见油管上的教学视频

一、Android Studio中创建aar

打开Android Studio,新建工程

新建模块

新建Java类

在PluginInstance.java中输入代码

package com.example.libforunity;

import android.app.Activity;
import android.widget.Toast;

public class PluginInstance {
    public int Add(int i,int j){
        return i+j;
    }

    private static Activity unityActivity;
    public  static  void receiveUnityActivity(Activity tActivity){
        unityActivity = tActivity;
    }

    public void Toast(String msg)
    {
        Toast.makeText(unityActivity,msg,Toast.LENGTH_SHORT).show();
    }
}

编译Library

可看到生成的aar文件了

二、在Unity中调用aar中的方法

打开Unity,新建工程

在Assets下新建Plugins/Android文件夹,并将生成的aar复制到该文件夹下

创建两个按钮和一个文本框

创建脚本PluginInit,编写代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class PluginInit : MonoBehaviour
{
    public Button btnAdd;
    public Button btnToast;
    public Text textPrompt;

    AndroidJavaClass unityClass;
    AndroidJavaObject unityActivity;
    AndroidJavaObject _pluginInstance;
    // Start is called before the first frame update
    void Start()
    {
        btnAdd.onClick.AddListener(Add);
        btnToast.onClick.AddListener(Toast);
        InitializePlugin("com.example.libforunity.PluginInstance");
    }

    void InitializePlugin(string pluginName)
    {
        unityClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
        unityActivity = unityClass.GetStatic<AndroidJavaObject>("currentActivity");
        _pluginInstance = new AndroidJavaObject(pluginName);
        if(_pluginInstance == null)
        {
            Debug.Log("Plugin Instance Error");
        }
        _pluginInstance.CallStatic("receiveUnityActivity", unityActivity);
    }

    public void Add()
    {
        if(_pluginInstance != null)
        {
            int result = _pluginInstance.Call<int>("Add", 5, 6);
            textPrompt.text = string.Format("Add Result from unity:{0}", result);
        }
    }

    public void Toast()
    {
        if (_pluginInstance != null)
        {
            _pluginInstance.Call("Toast", "Hi,from Unity");
        }
    }
}

给脚本赋值,发布APK,运行

三、在aar中引用第三方aar插件

这里我们以一个USB小票打印插件(autoreplyprint.aar)为例,主要参考了其官方提供的安卓工程,需要将相关功能移植到Unity环境下。

复制autoreplyprint.aar和res/xml/device_filter.xml到工程中(res下的文件也将自动打包到aar中

在PluginInstance.java中加入两个方法和一个变量

public  String EnumUsb()
    {
        String result = "";
        String[] devicePaths = AutoReplyPrint.CP_Port_EnumUsb_Helper.EnumUsb();
        if (devicePaths != null) {
            for (int i = 0; i < devicePaths.length; ++i) {
                String name = devicePaths[i];
                result += name;
                result += "|";
            }
        }

        return result;
    }

    public void OpenUSB(String usbName)
    {
        new Thread(new Runnable() {
            @Override
            public void run() {
                h = AutoReplyPrint.INSTANCE.CP_Port_OpenUsb(usbName, 1);
                AutoReplyPrint.INSTANCE.CP_Pos_SetMultiByteMode(h);
                AutoReplyPrint.INSTANCE.CP_Pos_SetMultiByteEncoding(h, AutoReplyPrint.CP_MultiByteEncoding_UTF8);
                AutoReplyPrint.INSTANCE.CP_Pos_SetTextBold(h, 0);
            }
        }).start();
    }
private Pointer h = Pointer.NULL;

接下来会发现当使用autoreplyprint.aar中的类时提示没有定义

  在build.gradle的dependencies中添加依赖项,然后点击Sync(大象图标),进行同步

compileOnly files('./libs/autoreplyprint.aar')

鼠标再移到未定义类上就会现【Import class】,点击它就可自动引用了,再次生成aar

复制生成的aar和autoreplyprint.aar(不要忘了)到unity,新增两个按钮EnumUSB、OpenUSB和一个下拉列表,下拉列表用于显示发现的USB串口

    public Button btnEnumUSB;
    public Button btnOpenUSB;
    public Dropdown usbList;

......
    btnEnumUSB.onClick.AddListener(EnumUsb);
    btnOpenUSB.onClick.AddListener(OpenUsb);
......

public void EnumUsb()
    {
        if (_pluginInstance != null)
        {
            string result = _pluginInstance.Call<string>("EnumUsb");
            string[] usbArray = result.Split(new char[] { '|' });
            usbList.AddOptions(usbArray.ToList());

            Debug.Log(string.Format("EnumUsb result={0}", result));
        }
    }

    public void OpenUsb()
    {
        if (_pluginInstance != null)
        {
            string usb = usbList.options[usbList.value].ToString();
            _pluginInstance.Call("OpenUSB", usb);
        }
    }

打包运行,发现无法识别USB串口,原因是在AndroidManifest.xml中没有添加USB权限

为避免多个AndroidManifest.xml合并时的冲突,先将Unity工程导出为Android 工程,再编辑保存。

将Unity工程导出为Android 工程,打开导出工程中的unityLibrary\src\main\AndroidManifest.xml,添加USB相关权根

<action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"/>
<meta-data android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" android:resource="@xml/device_filter"/>

 然后另存为到Assets\Plugins\Android 目录下,保存后再次打开确认一下是否真的修改了。

再次打包运行, 发现这次可以正确识别USB了。

全文完。写作不易,请收藏点赞,谢谢!!

  • 10
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值