Unity调用Android的两种方式:其一、调用jar包
unity在Android端开发的时候,免不了要调用Java;Unity可以通过两种方式来调用Android:一是调用jar、二是调用aar。
这篇文章主要讲解怎么从无到有的生成一个jar包,然后unity怎么调用jar。
一、通过Android studio生成jar包。
首先,在Android studio上面新建一个工程。
选择你要发布的Android 版本,注意:要和unity保持一致。
选择empty activity
默认的activity name不用动,直接点finish
找到unity的安装路径D:\****\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Release\Classes
复制class.jar到Android studio\Project\app\libs
在Android studio的file 找到Project Structure... 点击
接下来找到app,找到dependdencies,点击右边的+号,选择第二个 2 file dependency
找到 libs下刚导进去的class.jar, 点击OK
接下来就是在MainActivity里编写接口了
将MainActivity继承UnityPlayerActivity,然后删掉setContentView(R.layout.activity_main); 如果不继承UnityPlayerActivity也是可以的,
类似这样
或者这样
选择其中的一种编写来接口
package com.hello.world; import android.os.Bundle;
import android.util.Log; import com.unity3d.player.UnityPlayerActivity; public class MainActivity extends UnityPlayerActivity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
//接口
public String test()
{
Log.v("测试","成功");
return "测试成功";
} }
在AndroidManifest.XML中添加 <meta-data android:name="unityplayer.UnityActivity" android:value="true" />
OK,目前为止准备工作已经完成了,接下来该打jar包了
打开app的build.gradle
将apply plugin: 'com.android.application' 改为apply plugin: 'com.android.library' 删掉 defaultConfig 下的 applicationId "com.hello.world"
在下面添加如下代码
task makeJar(type: Copy) {
delete 'build/libs/unitylib.jar'
from('build/intermediates/bundles/release/')
into('build/libs/')
include('classes.jar')
rename('classes.jar', 'unitylib.jar')
} makeJar.dependsOn(build)
打开Terminal 输入gradlew makeJar 然后敲回车
我之前更新Android SDK的时候更改过路径,就会报错: Could not find tools.jar. Please check that D:\AndroidStudio\MyJDK\MyJava cont
解决的方法是在gradle.properties中配置一下路径就OK了:org.gradle.java.home=D:\\AndroidStudio\\MyJDK\\JDk
显示这样就说明jar打包成功了
打好的jar包就在app/build/libs下
二、unity调用jar包
新建一个工程,将unity切换到Android平台,点击player Setting
将unity的包名和Android的版本设置的和jar包的一样
扩展:unity和调Android有两种方法:
一种是通过AndroidJavaClass类,建立在AndroidJNIHelper的基础上
一种是通过AndroidJavaObject类,建立在AndroidJNI的基础上,是AndroidJavaClass的父类
在这里我们通过AndroidJavaObject来调用,简单。还有一个原因,通过AndroidJavaClass调用时,打包的时候光报错,搞了两天也没解决bug, 心中万匹草泥马奔腾而过,所以果断放弃了这个方法,有兴趣的同学可以研究一下,回头教教我。
我们继续
在assets先创建Plugins/Android,主要名字别写错了,在Android studio中找到jar包,把它放在Android文件夹下,
添加脚本test,保存场景为test
在test脚本里添加如下代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine; public class Test : MonoBehaviour { void OnGUI()
{
//方法一
try {
var javaClass = new AndroidJavaObject("com.hello.world.MainActivity");
string value1=javaClass.Call<string>("test");
GUI.Label (new Rect(,,,),value1);
} catch (System.Exception ex) {
GUI.Label (new Rect(,,,),ex.ToString());
}
//方法二
try {
AndroidJavaClass jc = new AndroidJavaClass ("com.unity3d.player.UnityPlayer");
AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject> ("currentActivity");
string value2=jo.Call<string> ("test");
GUI.Label(new Rect(,,,),value2);
} catch (System.Exception ex) {
GUI.Label (new Rect(,,,),ex.ToString());
} }
}
打包场景,搞定。
Android模拟器运行结果:
如果你按我上面的步骤进行的,或者看其他人写的教程,Unity在Build时都一样报错,那么恭喜你,你将终结这个噩梦。
1、找到Android studio工程里的values/styles.xml
2、打开后是这样子的
3、同志们,重点来了,简单粗暴一点,将styles.xml里的东西统统删掉,只留下如下内容
OK了,重新生成jar包,然后放心的扔到Unity了Build去吧,绝对不会再有问题了。
求关注啊,同志们
Unity调用Android的两种方式:其一、调用jar包的更多相关文章
- unity调用Android的两种方式:其二,调用aar包
上一篇我们讲了unity如何调用jar包 http://www.cnblogs.com/Jason-c/p/6743224.html, 现在我们介绍一下怎么生成aar包和unity怎么调用aar 一. ...
- Unity调用Android的两个方式:其一、调用jar包
unity在Android端开发的时候,免不了要调用Java:Unity可以通过两种方式来调用Android:一是调用jar.二是调用aar. 这篇文章主要讲解怎么从无到有的生成一个jar包,然后un ...
- 调用init方法 两种方式 一个是浏览器方法 一个是 xml中手工配置(load-on-startup)
调用init方法 两种方式 一个是浏览器方法 一个是 xml中手工配置(load-on-startup)
- C++调用DLL有两种方法——静态调用和动态调用
C++调用DLL有两种方法——静态调用和动态调用 标签: dllc++winapinullc 2011-09-09 09:49 11609人阅读 评论(0) 收藏 举报 分类: cpp(30) [ ...
- 自学Linux Shell9.2-基于Red Hat系统工具包存在两种方式之一:RPM包
点击返回 自学Linux命令行与Shell脚本之路 9.2-基于Red Hat系统工具包存在两种方式之一:RPM包 本节主要介绍基于Red Had的系统(测试系统centos) 1. 工具包存在两种方 ...
- Spring容器自动调用方法的两种方式
先看一个Spring中Bean的实例化过程: 1.配置文件中指定Bean的init-method参数 <bean class="com.jts.service.UserService& ...
- 软件调用QML的两种方式
一.两种方式 二.方式1[对窗口的控制权在QML] 三.方式2[对窗口的控制权在C++]
- python之子类调用父类的两种方式
第一种方式 直接在子类中调用父类名: Vehicle.__init__(self,name,speed,load,power)#调用父类的实例 Vehicle.run(self) #调用父类的方法 # ...
- JS调用函数的两种方式
<script type="text/javascript"> window.onload = init; //onload 表示页面全部加载完毕后,再调用init() ...
随机推荐
- SpringMVC(一) 简单代码编写,注解,重定向与转发
SpringMVC是什么 SpringMVC是目前最好的实现MVC设计模式的框架,是Spring框架的一个分支产品,以SpringIOC容器为基础,并利用容器的特性来简化它的配置.SpringMVC相 ...
- 函数签名与消息转发:NSInvocation与NSMethodSignature
具体可见 https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Article ...
- java 实现多线程 3种方式
java实现多线程可以有以下三种方式: (1)继承Thread 类,重写其run()方法: (2)实现Runnable接口,实现其run() 方法: (3) 实现Callable 接口,重写call( ...
- 百度蜘蛛IP地址到底代表什么含义?
百度蜘蛛IP地址到底代表什么含义,是不是不同的ip地址所代表的含义不一样呢?对权重和抓取是否有影响?哪些是无效的蜘蛛,哪些是站长工具的蜘蛛,那些又是百度自己真正的蜘蛛?百度蜘蛛,是百度搜索引擎的一个自 ...
- Valgrind的安装及简单使用
1.获取源码 wget http://www.valgrind.org/downloads/valgrind-3.14.0.tar.bz2 2.解压缩 tar -jxvf valgrind-3.14. ...
- pandas 7 合并 merge 水平合并,数据会变宽
pd.merge( df1, df2, on=['key1', 'key2'], left_index=True, right_index=True, how=['left', 'right', 'o ...
- python字典对象的update()方法
使用字典对象的update()方法,如A.update(B),将B字典的键值对一次性全部添加到A字典对象,当A字典为空时,相当于深复制,非常方便.如果两个字典中存在相同的键,则进行值的更新. A={} ...
- 【CS Round 34】Max Or Subarray
[题目链接]:https://csacademy.com/contest/round-34/summary/ [题意] 让你找一个最短的连续子串; 使得这个子串里面所有数字or起来最大; [题解] 对 ...
- 走进Java(一)J2SE
一.Java是什么 Java是Java语言和Java平台的总称.Java语言和C#一样.核心都是oo.并且比較而言,Java做的更好. Java由四方面组成: • Java编程语言,即 ...
- 【通信框架】Google的开源通信框架protobuf概述
在阅读的过程中有不论什么问题,欢迎一起交流 邮箱:1494713801@qq.com QQ:1494713801 一.作用 protobuf(Protocol Buffers)是Google内部 ...