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.rhkb.cn/news/263658.html

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

相关文章

牛客周赛 Round 34 解题报告 | 珂学家 | 构造思维 + 置换环

前言 整体评价 好绝望的牛客周赛,彻底暴露了CF菜菜的本质,F题没思路,G题用置换环骗了50%, 这大概是唯一的亮点了。 A. 小红的字符串生成 思路: 枚举 a,b两字符在相等情况下比较特殊 a, b input().split() if a b:print (2)print (a)pri…

三种方法用c语言求最大公约数以及最小公倍数

学习目标: 掌握求最大公约数(最小公倍数)的三种基本方法 学习内容: 1.一大一小取其小,剖根问底取公约 意思是从一大一小两个数当中,我们取较小的那个数(min)进行剖析,试…

django rest framework 学习笔记-实战商城

01项目环境搭建_哔哩哔哩_bilibili 本博客借鉴至大佬的视频学习笔记 # 创建项目 django-admin startproject MyShop# 创建app E:\desktop\my_drf\MyShop>django-admin startapp goodsE:\desktop\my_drf\MyShop>django-admin startapp orderE:\desktop\my_drf\MyShop>…

搭建私有Git服务器:GitLab部署详解

引言: 为了方便团队协作和代码管理,许多组织选择搭建自己的私有Git服务器。GitLab是一个集成了Git版本控制、项目管理、代码审查等功能的开源平台,是搭建私有Git服务器的理想选择。 目录 引言: 一、准备工作 在开始部署GitLab之…

Linux之ACL权限chmod命令

一. chmod命令 chmod命令来自英文词组change mode的缩写,其功能是改变文件或目录权限的命令。默认只有文件的所有者和管理员可以设置文件权限,普通用户只能管理自己文件的权限属性。 设置权限时可以使用数字法,亦可使用字母表达式&#xff0…

RisingWave最佳实践-利用Dynamic filters 和 Temporal filters 实现监控告警

心得的体会 刚过了年刚开工,闲暇之余调研了分布式SQL流处理数据库–RisingWave,本人是Flink(包括FlinkSQL和Flink DataStream API)的资深用户,但接触到RisingWave令我眼前一亮,并且拿我们生产上的监控告警…

Android Gradle 开发与应用 (一) : Gradle基础

1. Gradle是什么 Gradle是一个通用的构建工具,支持诸多主要的 IDE,包括 Android Studio、IntelliJ IDEA、Visual Studio 等 Gradle 的底层实现(核心引擎和框架)其实是用 Java 编写的开发者通常使用 Groovy 或 Kotlin 来编写构建脚本 1.1 那么为什么Gra…

Order By Limit不稳定性

文章目录 前置解决不确定性场景1 Order By索引1.1 背景1.2 不确定性产生原因1.2.1 正常情况下1.2.2 但是 1.3 补充1.4 场景1总结 场景2 Order by id2.1 背景2.2 不会产生不确定性原因1原因2 2.3 推荐使用方式 场景3 filesort3.1 背景3.2 不确定性产生原因3.3 内存排序和磁盘临时…

Jmeter基础(3) 发起一次请求

目录 Jmeter 一次请求添加线程组添加HTTP请求添加监听器 Jmeter 一次请求 用Jmeter进行一次请求的过程,需要几个步骤呢? 1、添加线程组2、添加HTTP请求3、添加监听器,查看结果树 现在就打开jmeter看下如何创建一个请求吧 添加线程组 用来…

【Java程序设计】【C00282】基于Springboot的校园台球厅人员与设备管理系统(有论文)

基于Springboot的校园台球厅人员与设备管理系统(有论文) 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的校园台球厅人员与设备管理系统 本系统分为系统功能模块、管理员功能模块以及用户功能模块。 系统功能模块&#xf…

【数据结构与算法】(16)基础算法 之哈希表 相关示例 详细代码讲解

目录 3.6 哈希表第一版生成 hashCode思考习题E01. 两数之和-Leetcode 1E02. 无重复字符的最长字串-Leetcode 3E03. 字母异位词分组-Leetcode 49E04. 判断有没有重复元素-Leetcode 217E05. 找出出现一次的数字-Leetcode 136E06. 判断字母异位词-Leetcode 242E07. 第一个不重复字…

前端工程化面试题 | 16.精选前端工程化高频面试题

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

vue : 无法加载文件 C:\Program Files\nodejs\node_global\vue.ps1,因为在此系统上禁止运行脚本。

解决方法: 打开PowerShell,在命令框输入set-ExecutionPolicy RemoteSigned 在PowerShell中输入会出现如下图,输入y即可。

数据结构-列表LinkedList

一,链表的简单的认识. 数组,栈,队列是线性数据结构,但都算不上是动态数据结构,底层都是依托静态数组,但是链表是确实真正意义上的动态数组. 为什么要学习链表? 1,链表时最简单的动态数据结构 2,掌握链表有助于学习更复杂的数据结构,例如,二叉树,trie. 3,学习链表有助于更深入…

unity学习(40)——创建(create)角色脚本(panel)——UI

1.点击不同的头像按钮,分别选择职业1和职业2,create脚本中对应的函数。 2.调取inputfield中所输入的角色名(限制用户名长度为7字符),但愿逆向的服务器可以查重名: 3.点击头衔,显示选择的职业&a…

Spring Boot 手写starter!!!

原因:为什么要手写starter??? 原因:简化功能。 实例:以分页为例:写一个starter。 1.首先定义一个PageX注解。 Target({ElementType.METHOD}) Retention(RetentionPolicy.RUNTIME) Documented p…

LeetCode 热题 100 | 二叉树(一)

目录 1 基础知识 1.1 先序遍历 1.2 中序遍历 1.3 后序遍历 2 94. 二叉树的中序遍历 3 104. 二叉树的最大深度 4 226. 翻转二叉树 5 101. 对称二叉树 菜鸟做题,语言是 C 1 基础知识 二叉树常见的遍历方式有: 先序遍历中序遍历后序遍历…

RocketMQ-架构与设计

RocketMQ架构与设计 一、简介二、框架概述1.设计特点 三、架构图1.Producer2.Consumer3.NameServer4.BrokerServer 四、基本特性1.消息顺序性1.1 全局顺序1.2 分区顺序 2.消息回溯3.消息重投4.消息重试5.延迟队列(定时消息)6.重试队列7.死信队列8.消息语…

神经网络系列---感知机(Neuron)

文章目录 感知机(Neuron)感知机(Neuron)的决策函数可以表示为:感知机(Neuron)的学习算法主要包括以下步骤:感知机可以实现逻辑运算中的AND、OR、NOT和异或(XOR)运算。 感知机(Neuron) 感知机(Neuron)是一种简单而有效的二分类算法,用于将输入…

jmeter下载base64加密版pdf文件

一、何为base64加密版pdf文件 如下图所示,接口jmeter执行后,返回一串包含大小写英文字母、数字、、/、的长字符串,直接另存为pdf文件后,文件有大小,但是打不开;另存为doc文件后,打开可以看到和…