开发环境: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了。
全文完。写作不易,请收藏点赞,谢谢!!