Unity与Android交互通信系列(5)

news2024/11/19 14:46:40

  在前述文章中,已经使用了AndroidJavaProxy代理接口,本节我们将详细的介绍AndroidJavaProxy代理的用法。正如其名,AndroidJavaProxy是一个代理,它在Android端代码与Unity端代码交互中起一个桥接作用。其一般用法为在Java代码中定义接口(Interface),建立代码调用外观,然后在Unity端用C#实现Java代码定义的接口,在使用时,在C#代码中实例化实现接口的类并将该实例对象传递到Java端,Java端根据情况执行接口方法,回调C#中的实现逻辑。

 下面通过一个实例进行演示。首先需要在Java端定义一个接口,ProxyExample.java文件代码如下:

//5-1
//Java端代码
package com.davidwang.android2unity;

public  interface ProxyExample
{
    void OnFired(String msg);
}

  然后,在C#端,通过AndroidJavaProxy代理实现该接口,在使用时将实现接口的类的实例传递到Java端,代码如下:

//5-2
//C#端代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class UnityProxyExample : MonoBehaviour
{
    void Start()
    {
        using (AndroidJavaObject jo = new AndroidJavaObject("com.davidwang.android2unity.ProxyUseCase"))
        {
            var mCallbackListener = new SDKCallbackListener();
            // 调用Jar中的方法,并把new的值传进去
            jo.Call("Init", mCallbackListener);
        }
    }

    class SDKCallbackListener : AndroidJavaProxy
    {
        // 引用Jar中接口
        public SDKCallbackListener() : base("com.davidwang.android2unity.ProxyExample") { }

        //实现接口中的方法
        public void OnFired(string str)
        {
            Debug.Log("OnFired:" + str);
        }
    }
}

  在代码5-2中,C#端实现了Java接口,接口中的方法必须为Public,方法签名与Java端完全一致。然后通过Java端的Init()方法将实现接口的实例对象传递到Java端,Java端使用方法代码如下:

//5-3
//Java端代码,ProxyUseCase.java
package com.davidwang.android2unity;

public class ProxyUseCase {
    private  ProxyExample proxyExample;
    public void Init(ProxyExample proxyExample){
        this.proxyExample = proxyExample;
        try {
            java.lang.Thread.sleep(5000);
            EventCallback();
        }
        catch (InterruptedException e)
        {
            e.printStackTrace();
        }
    }
    public void EventCallback(){
        proxyExample.OnFired("some event fired in Android ");
    }
}

  在代码5-3中,EventCallback()方法本应该由Java端的其他事件触发,为演示简单,这里采用了延时触发方法。Java端通过调用其接口方法,实现了对C#端实例对象方法的调用。他们之间的关系示意图如图1所示。
在这里插入图片描述

图1 AndroidJavaProxy原理示意图
  在C#端,通过实现Java端的接口,可以生成本地端的实例对象,这个实例对象在Mono / IL2CPP虚拟机内,然后通过调用Java端的方法将本地端的实例对象引用传递到Java端,因为实例对象实现了Java端的接口,所以Java端可以通过接口调用到实例对象的方法,本质上是通过引用调用Mono / IL2CPP虚拟机端的本地实例对象。所以AndroidJavaProxy代理实质上是在C#端与Java端建立了一个对象引用指针,通过这个指针可以指向实例对象,虽然这个实例对象存在于另一个虚拟机中。

  本节中,我们采用另一种打包方式,将代码打包成Jar包。Jar包只包含编译后的class文件与清单文件,不包含图片布局等资源文件;aar包则包含所有相关的资源,class文件、清单文件、res资源文件等。所以如果只有类库文件时建议生成Jar包;如果还包含布局文件、图片、字体等资源文件时建议使用aar包。

  在Android Studio中,类库的建立方法与Unity与Android交互通信系列(3)所述一致,不再赘述。点击展开app目录下的android2unity目录,双击鼠标打开该目录下的build.gradle文件,如图2所示。
在这里插入图片描述

图2 打开类库目录下的build.gradle文件
  如图2所示,在打开的build.gradle文件中dependencies指令前添加一个task[ Task任务要作为一级指令,即不包含在其他编译指令之中。],task任务指令代码如下:
//5-4
task makeJar(type: Copy) {
    //如果之前有编译打包,则删除原存在的jar包
    delete 'build/libs/andriod2unity.jar'
    //Android Studio默认打包路径
    from('build/intermediates/aar_main_jar/release/')
    //将打包后的文件复制到该目录下
    into('build/libs/')
    //include参数来设置过滤,我们只关心classes.jar包
    include('classes.jar')
    //重命名生成的jar包
    rename ('classes.jar', 'andriod2unity.jar')
}
makeJar.dependsOn(build)

  编译Jar包时,鼠标点击task任务左侧的绿色三角形图标展开下拉菜单,单击鼠标选择“Run ’Android2Unity[makeJ…’”开始编译打包,如图3所示。
在这里插入图片描述

图3 编译生成Jar包

  编译打包成功后,即可以在android2unity类库模块下的build/libs目录下找到生成的android2unity.jar包[ 根据Android Studio版本不同,有的版本不会生成libs目录,这时可以将Jar包生成到outputs目录中,即代码清单5-4中将Jar包生成的路径修改到build/outputs目录下。通过Task任务的方式还可同时生成aar包,该包区分debug、release版本,位于build/outputs/aar目录下]。与使用aar包一样,将该jar文件复制到Unity工程Assets/Plugins/Android目录或其子目录下,然后在Unity端将UnityProxyExample脚本挂载到场景中的任意对象上,连接手机,打包运行,即可看到正确的调用输出。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1469583.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++】类和对象之拷贝构造函数篇

个人主页 : zxctscl 文章封面来自:艺术家–贤海林 如有转载请先通知 文章目录 1. 前言2. 传值传参和传引用传参3. 概念4. 特征 1. 前言 在前面学习了6个默认成员函数中的构造函数和析构函数 【C】构造函数和析构函数详解,接下来继续往后看拷…

S-35390A计时芯片介绍及开发方案

计时芯片 S-35390A芯片是计时芯片,一般用来计算时间。低功耗,宽电压,受温度影响小,适用于很多电路。它有一个问题,不阻止用户设置不存在的时间,设置进去之后计时或者闹钟定时会出错。 规格书阅读 首先我…

如何移除禁用WordPress默认小工具(附WordPress默认小工具名称)

WordPress 自带的小工具非常多,但是我们用到的也就那么几种,甚至一种都不会用到,所以很有必要注销(去除)掉一些不用的小工具。实现的方法也很简单,只需将以下代码,根据自己的情况删除需要用的小…

精品基于SpringBoot的体育馆场地预约赛事管理系统的设计与实现-选座

《[含文档PPT源码等]精品基于SpringBoot的体育馆管理系统的设计与实现[包运行成功]》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、包运行成功! 软件开发环境及开发工具: Java——涉及技术: 前端使用技术&#…

掌握3个Mock工具,轻松玩转单元测试

公司要求提升单元测试的质量,提高代码的分支覆盖率和行覆盖率,安排我研究单元测试,指定方案分享并在开发部普及开。 单元测试中的Mock的目的 Mock的主要目的是让单元测试Write Once, Run Everywhere. 即编写一次后,可以在任意时…

程序媛的mac修炼手册-- 2024如何彻底卸载Python

啊,前段时间因为想尝试chatgpt的API,需要先创建一个python虚拟环境来安装OpenAI Python library. 结果,不出意外的出意外了,安装好OpenAI Python library后,因为身份认证问题,根本就没有获取API key的权限…

【YOLO系列算法人员摔倒检测】

YOLO系列算法人员摔倒检测 模型和数据集下载YOLO系列算法的人员摔倒检测数据集可视化数据集图像示例: 模型和数据集下载 yolo行人跌倒检测一: 1、训练好的行人跌倒检测权重以及PR曲线,loss曲线等等,map达90%多,在行人跌…

GEE必须会教程—曾“几何”时(Geometry类型)

几何图形组成了世界万物,在数学史具有重要地位,将几何图形迁移到地理空间信息的处理上,我们我们得到就是研究区域的边界范围,因此,在学习矢量数据和栅格数据之前,我们有必要了解几何图形在GEE上的编辑。 1…

019 Spring Boot+Vue 电影院会员管理系统(源代码+数据库+文档)

部分代码地址: https://github.com/XinChennn/xc019-cinema 一、系统介绍 cinema项目是一套电影院会员管理系统,使用前后端分离架构开发包含管理员、会员管理、会员卡管理、电影票、消费记录、数据统计等模块 二、所用技术 后端技术栈: …

【爬虫逆向实战篇】定位加密参数、断点调试与JS代码分析

文章目录 1. 写在前面2. 确认加密参数3. 加密参数定位4. XHR断点调试 【作者主页】:吴秋霖 【作者介绍】:Python领域优质创作者、阿里云博客专家、华为云享专家。长期致力于Python与爬虫领域研究与开发工作! 【作者推荐】:对JS逆向…

openssl3.2 - 编译 - zlib.dll不要使用绝对路径

文章目录 openssl3.2 - 编译 - 编译时的动态库zlib.dll不要使用绝对路径概述测试zlib特性在安装好的目录中是否正常笔记70-test_tls13certcomp.t80-test_cms.t对测试环境的猜测从头再编译测试安装一次测试一下随便改变位置的openssl用到zlib时是否好使测试一下随便改变位置的op…

11-ATF初始化Normal cpu context

ATF (Arm Trusted Firmware) 初始化 Normal CPU Context 的步骤主要涉及设置正常世界(Normal World)CPU的环境,确保在从安全世界(Secure World)切换到正常世界时,CPU能够正确执行正常世界的代码。以下是一般步骤的概述: CPU启动与初始化: 在系统启动时,CPU首先在安全世…

ChatGPT Plus遇到订阅被拒原因与解决方案

ChatGPT Plus被广泛认为相比普通版本更快、更强,并且能最先体验新功能。 很多小伙伴再订阅时遇到图片中的问题 错误提示包括这些: Your credit card was declined.Try paying with a debit card instead.您的信用卡被拒绝了。请尝试用借记卡支付。你的…

Vue+SpringBoot打造高校实验室管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容2.1 实验室类型模块2.2 实验室模块2.3 实验管理模块2.4 实验设备模块2.5 实验订单模块 三、系统设计3.1 用例设计3.2 数据库设计 四、系统展示五、样例代码5.1 查询实验室设备5.2 实验放号5.3 实验预定 六、免责说明 一、摘…

国内Twitter账号注册要注意什么?注册多个Twitter账号如何防止被封?

在这个数字化快速发展的时代,Twitter作为一个全球性的社交媒体平台,对于个人品牌塑造乃至跨境电商均有着不可忽视的影响力。然而,在中国大陆地区,对于Twitter账号注册以及如何安全地注册多个Twitter账号这样的话题,往往…

详解 IT/OT 融合的五层架构(从PLC/SCADA到MES/ERP)

作为一个电气自动化的从业者,有必要搞懂下面术语的意思。 IT:Information Technology的缩写,指信息技术; OT:Operational Technology的缩写,指操作层面的技术,比如运营技术;CT&…

Java8 Stream API 详解:流式编程进行数据处理

🏷️个人主页:牵着猫散步的鼠鼠 🏷️系列专栏:Java全栈-专栏 🏷️个人学习笔记,若有缺误,欢迎评论区指正 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默&…

xss靶场实战(xss-labs-master靶场)

xss-labs-master靶场链接&#xff1a;https://pan.baidu.com/s/1X_uZLF3CWw2Cmt3UnZ1bTw?pwdgk9c 提取码&#xff1a;gk9c xss-labs level 1 修改 url 地址中的name<script>alert(1)</script>&#xff0c;便可以通关 level 2 在搜索框中输入的 JS 代码无法执行 …

vDPA测试环境搭建

要求&#xff1a; 运行 Linux 发行版的计算机。本指南使用 CentOS 9-stream&#xff0c;但对于其他 Linux 发行版&#xff0c;特别是对于 Red Hat Enterprise Linux 7&#xff0c;命令不应有重大变化。 具有 sudo 权限的用户 ~ 主目录中有 25 GB 的可用空间 至少 8GB 内存 …

完美解决ubuntu+windows双系统下时间不正确问题

在同一台电脑上安装ubuntuwindows双系统时&#xff0c;会出现某个系统的时间不正确的问题&#xff0c;而由于windows同步时间实在是太慢了&#xff0c;如果不去解决&#xff0c;windows上的时间大概率一直都是不对的。 原因分析 windows采用LocalTime机制设置时间&#xff0c…