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://xiahunao.cn/news/2807255.html

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

相关文章

网络原理——HTTP

1. 什么是HTTP协议 HTTP是应用层的协议。Java最主要的应用场景是做网站,而网站由 后端(HTTP服务器) 和 前端(浏览器)组成,HTTP协议就是负责这里后端和前端的数据交互。 HTTP3.0 之前在传输层是通过 TCP传…

并发编程(5)共享模型之不可变

7 共享模型之不可变 本章内容 不可变类的使用不可变类设计无状态类设计 7.1 日期转换的问题 问题提出 下面的代码在运行时,由于 SimpleDateFormat 不是线程安全的, 有很大几率出现 java.lang.NumberFormatException 或者出现不正确的日期解析结果,…

PyQt5图片浏览器

PyQt5图片浏览器 实现方式功能实现具体代码 界面实现pillow源码修改ImageQt错误主页面布局 项目开源地址 分享一个图片浏览器 实现方式 qt本身有一个QGraphicsView类用来当做视图框架。 具体参考:如何在pyqt中使用 QGraphicsView 实现图片查看器 不过大佬给的例子…

微信小程序 uniapp+vue餐厅美食就餐推荐系统

本论文根据系统的开发流程以及一般论文的结构分为三个部分,第一个部分为摘要、外文翻译、目录;第二个部分为正文;第三个部分为致谢和参考文献。其中正文部分包括: (1)绪论,对课题背景、意义、目…

eBPF实践篇之基础概念

文章目录 前言基本概念eBPF的生命周期之旅最后 前言 eBPF 是一门革命性的技术,可以在不修改内核源代码或者加载内核模块的情况下,安全和高效地拓展和增强Linux内核的功能,我们主要聚焦在eBPF在网络传输上的应用和实践🚀 基本概念…

AI时代显卡如何选择,B100、H200、L40S、A100、H100、V100 含架构技术和性能对比

AI时代显卡如何选择,B100、H200、L40S、A100、H100、V100 含架构技术和性能对比。 英伟达系列显卡大解析B100、H200、L40S、A100、A800、H100、H800、V100如何选择,含架构技术和性能对比带你解决疑惑。 近期,AIGC领域呈现出一片繁荣景象&a…

企业型多域名SSL证书

多域名SSL证书是目前市场上用的比较多的一种,主要解决多个不同规则的域名申请,但不适合主域名(根域名)相同的域名,因为这种域名直接申请通配符。 企业型其实就是OV类型或者EV类型,由于在CA/B产品名称规范中…

【k8s资源调度-HPA(自动扩缩容)】

1、HPA可以做什么? 通过观察pod的cpu、内存使用率或自定义metrics指标进行自动的扩容或缩容pod的数量。通常用于Deployment,不适用于无法扩/缩容的对象,如DaemonSet。控制管理器每隔30s(可以通过-horizontal-pod-autoscaler–sync-period修改…

Ubuntu20.04和Windows11下配置StarCraft II环境

1.Ubuntu20.04 根据下面这篇博客就可以顺利安装: 强化学习实战(九) Linux下配置星际争霸Ⅱ环境https://blog.csdn.net/weixin_39059031/article/details/117247635?spm1001.2014.3001.5506 Ubuntu下显示游戏界面目前还没有解决掉。 大家可以根据以下链接看看能…

Jenkins详解

目录 一、Jenkins CI/CD 1、 Jenkins CI/CD 流程图 2、介绍 Jenkins 1、Jenkins概念 2、Jenkins目的 3、特性 4、产品发布流程 3、安装Jenkins 1、安装JDK 2、安装tomcat 3.安装maven 4安装jenkins 5.启动tomcat,并页面访问 5.添加节点 一、Jenkins CI/…

[深度学习]yolov9+bytetrack+pyqt5实现目标追踪

【简介】 目标追踪简介 目标追踪是计算机视觉领域中的一个热门研究方向,它涉及到从视频序列中实时地、准确地跟踪目标对象的位置和运动轨迹。随着深度学习技术的快速发展,基于深度学习的目标追踪方法逐渐展现出强大的性能。其中,YOLOv9&…

web安全学习笔记【16】——信息打点(6)

信息打点-语言框架&开发组件&FastJson&Shiro&Log4j&SpringBoot等[1] #知识点: 1、业务资产-应用类型分类 2、Web单域名获取-接口查询 3、Web子域名获取-解析枚举 4、Web架构资产-平台指纹识别 ------------------------------------ 1、开源-C…

K线实战分析系列之一:标准K线图的识别

K线实战分析系列之一:标准K线图的识别 一、阳线和阴线二、光头K线三、光脚K线四、光头光脚大阳线五、纺锤线六、十字线 一、阳线和阴线 二、光头K线 如果某根K线没有上影线,就叫它光头k线 三、光脚K线 某一根K线没有下影线就叫它光脚K线 四、光头光…

广联达Linkworks GetAllData 信息泄露漏洞

免责声明:文章来源互联网收集整理,请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果与文章作者无关。该…

【CSS-语法】

CSS-语法 ■ CSS简介■ CSS 实例■ CSS id 和 class选择器■ CSS 样式表■ 外部样式表(External style sheet)■ 内部样式表(Internal style sheet)■ 内联样式(Inline style)■ 多重样式 ■ CSS 文本■ CSS 文本颜色■ CSS 文本的对齐方式■ CSS 文本修饰■ CSS 文本转换■ CS…

力扣1290. 二进制链表转整数

Problem: 1290. 二进制链表转整数 文章目录 题目描述思路复杂度Code 题目描述 思路 1.记录一个变量res初始化为0,指针p指向链表头; 2.循环每次res res * 2 p -> val;p p -> next;(充分利用二进制数的特性;其中利用指针先…

Flutter开发进阶之Package

Flutter开发进阶之Package 通常我们在Flutter开发中需要将部分功能与整体项目隔离,一般有两种方案Plugin和Package,Application是作为主体项目,Module是作为原生项目接入Flutter模块。 当独立模块不需要与原生项目通讯只需要Plugin就可以&a…

Python + Google AI 自动修复 Sonar Bug 实践

前言 在工作中总会遇到种种不期而至的需求,比如前段时间突然要修复所有 Sonar Bug,涉及各种琐碎的代码风格问题,包括但不限于语法不规范、废弃注释等问题。这些项目都已经持续开发几年了,Sonar 上的问题层出不穷,各种…

记一次生产jvm oom问题

前言 jvm添加以下参数,发生OOM时自动导出内存溢出文件 -XX:HeapDumpOnOutOfMemoryError -XX:HeapDumpPath/opt 内存分析工具: MAT, 下载地址:Eclipse Memory Analyzer Open Source Project | The Eclipse Foundation, 注意工具地址…

【多线程】volatile 关键字、wait 和 notify方法详解

volatile 、wait 和 notify 🌲volatile关键字🚩保证内存可见性🚩volatile 不保证原⼦性 🌳wait 和 notify方法🚩wait()🚩notify()🚩notifyAll()方法 ⭕wait 和 sleep 的对比( 面试题…