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

  在前述文章中,已经使用了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.mzph.cn/news/701155.shtml

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

相关文章

【深度学习】主要提出者【Hinton】中国大会最新演讲【通往智能的两种道路】

「但我已经老了,我所希望的是像你们这样的年轻有为的研究人员,去想出我们如何能够拥有这些超级智能,使我们的生活变得更好,而不是被它们控制。」 6 月 10 日,在 2023 北京智源大会的闭幕式演讲中,在谈到如…

一键生成PDF即刻呈现:轻松创建无忧体验

在信息爆炸的时代,我们每天都在与各种文件、资料打交道。无论是工作中的报告、合同,还是学习中的笔记、论文,如何高效、安全地管理这些珍贵的资料,成为了我们迫切的需求。幸运的是,随着科技的发展,我们不再…

SpringBoot Admin 详解

SpringBoot Admin 详解 一、Actuator 详解1.Actuator原生端点1.1 监控检查端点:health1.2 应用信息端点:info1.3 http调用记录端点:httptrace1.4 堆栈信息端点:heapdump1.5 线程信息端点:threaddump1.6 获取全量Bean的…

4、全球资产配置策略

2022年06月23日 传统的资产配置就是在债券类资产和国内股票类资产间以一定的比例进行调整。但是这类资产配置模式往往缺乏一类风险收益特征和国内资产接近但相关性较低、并且还可以有效分散国内市场风险的资产,而进行境外资产投资则可以很好地弥补这一空缺。实际上全…

Java学习——正则表达式

正则表达式是一种强大的文本处理工具,用于搜索、匹配、替换文本。它们定义了字符串的搜索模式,可以快速地检查一个字符串是否与某个模式匹配,提取匹配字符串,或者执行替换操作。正则表达式在文本编辑器、编程语言和数据库管理中广…

R3F(React Three Fiber)基础篇

之前一直在做ThreeJS方向,整理了两篇R3F(React Three Fiber)的文档,这是基础篇,如果您的业务场景需要使用R3F,您又对R3F不太了解,或者不想使用R3F全英文文档,您可以参考一下这篇&…

【Python笔记-设计模式】享元模式

一、说明 享元模式是一种结构型设计模式,它摒弃了在每个对象中保存所有数据的方式,通过共享多个对象所共有的相同状态,让你能在有限的内存容量中载入更多对象。 (一) 解决问题 旨在减少大量相似对象创建时的内存开销 (二) 使用场景 大量…

AI:136-基于深度学习的图像生成与风格迁移

🚀点击这里跳转到本专栏,可查阅专栏顶置最新的指南宝典~ 🎉🎊🎉 你的技术旅程将在这里启航! 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 ✨✨✨ 每一个案例都附带关键代码,详细讲解供大家学习,希望…

github 笔记: fatal: Could not read from remote repository.

git clone 包时出现这两行报错 gitgithub.com: Permission denied (publickey). fatal: Could not read from remote repository.这意味着 SSH 认证失败了,通常是因为本地机器的 SSH 密钥未被 GitHub 账户识别/未正确设置。在终端中使用 ssh -T gitgithub.com 可以…

微服务三十五关

1.微服务有什么好处? 微服务优点很多,但是我们通常说一个东西好肯定会跟另一个东西比较, 通常说微服务好会和单体项目进行比较。以下是微服务相对于单体项目的一些显著好处: 首先,让我们讨论单体项目的一些主要缺点&a…

STM32_LCD1602_2_液晶屏初始化

HD44780的指令集及其设置说明 共11条指令: 清屏指令 指令功能指令编码执行时间/msRSR/WDB7DB6DB5DB4DB3DB2DB1DB0清屏00000000011.64 功能: 清除液晶屏,即将DDRAM的所有内容都写为“空”的ASCII的20H;光标归位,即将光…

多态与代码屎山

到底什么是多态呢?多态是面向未来的,比如企业采购为例: 一般分为线上合线下两种, 我们设计一个父类叫做"采购", 里面做一些共通的处理: 申请, 承认, 支付, 购买方式. 然后让各自的子类(线上,线下)实现自己的方法.实际调用过程中传入不同的对象就可以.到此为止项目开…

在线程调用的函数中使用pthread_exit同样会将线程退出

如上图所示,在func()函数中调用pthread_exit,同样可以退出当前线程; 类似的,如果func()函数中调用exit,可以直接退出整个进程。 return 是返回到函数调用处; pthread_exit是退出…

KTV点歌系统vue+springboot音乐歌曲播放器系统

目前现有的KTV点歌系统对于用户而言其在线点歌流程仍然过于繁琐,对于歌曲而言其系统安全性并不能保障。同时整套系统所使用的技术相对较为落后,界面不能动态化展示。相比较于其它同类型网站而言不能体现技术先进性。 1.2 项目目标 KTV点歌系统的后台开发…

wpf 3d 后台加载模型和调整参数

下载了一个代码,加载obj模型;它的参数在xaml里,模型加载出来刚好; 然后加载另一个obj模型;加载出来之后大,偏到很高和左的位置; 它之前的摄像机位置, Position"9.94759830064…

Apache celeborn 安装及使用教程

1.下载安装包 https://celeborn.apache.org/download/ 测0.4.0时出现https://github.com/apache/incubator-celeborn/issues/835 2.解压 tar -xzvf apache-celeborn-0.3.2-incubating-bin.tgz 3.修改配置文件 cp celeborn-env.sh.template celeborn-env.shcp log4j2.xml.…

前后端分离Vue+nodejs校园论坛bbs系统x450z

开发语言 node.js 框架:Express 前端:Vue.js 数据库:mysql 数据库工具:Navicat 开发软件:VScode本论文拟采用计算机技术设计并开发的论坛bbs系统,主要是为用户提供服务。使得用户可以在系统上查看帖子信息、签到积分等…

jQuery中的事件与DOM操作

jQuery事件 jQuery事件是对JavaScript事件的封装,常用事件分类 基础事件 鼠标事件键盘事件window事件表单事件绑定事件与移除事件复合事件 鼠标光标悬停鼠标连续点击jQuery基础事件 鼠标事件 鼠标事件是当用户在文档上移动或单击鼠标时而产生的事件 下面是一个使用 Markdow…

大厂嵌入式公司面试真题

面试题: 基础知识题 请解释C语言中的指针是什么以及它们如何工作?描述C语言中的动态内存分配。malloc、calloc、realloc和free这些函数有何区别?C语言中的宏(macro)和函数之间有什么不同?代码理解题 #incl…

详解Megatron中的数据混合算法(BlendableDataset)

🧑‍💻 本文主要讲解Megatron早期版本中的数据混合算法。 目录 1. 数据混合2. 源码解析3. 证明部分&讨论4. 进一步优化 1. 数据混合 在谈源码之前,我们有必要先了解一下Megatron中的数据混合思想。 给定 n n n 个数据集 D 1 , D 2 , …