文章目录
工作原理
Unity提供了C#代码调用Java的代码,原理其实就是JNI。开发的jar sdk需要放置在一个特殊的目录中,Unity会识别里面有关java或者android的东西,一并打包进apk里。
环境依赖
- Unity:截止这篇文章写完,用的是Unity2017
- java:java 1.8,原因是Unity用的就是Java1.8.理论上更高的jdk打包jar也行,但是源码中不能用新特性。
最简单的Java调用
- 我们需要写一个最简单的jar包
- 然后将它放入到Unity工程目录中
- 打包成apk
- 将apk运行在手机上
- 在游戏运行的时候调用java相关接口。
书写java代码
在一个空目录(我的是UnityJarSDK)下构建我们最简单的java源码。目录结构如下:
其中src是用来存放源文件的,out一开始是空的,用来存放输出的文件。不用管bat。我们来看一下MyMain.java
中的代码:
package com.qtc.test; // 说明了这个文件处在的包。它决定了javac生成class的时候输出的目录结构
public class MyMain{
// 一个普通的类方法
public int MyAdd(int a, int b)
{
return a + b;
}
// 一个静态方法,这两种方法在Unity中的调用方式是不一样的
public static String HelloWorld()
{
return "HelloWorld";
}
}
然后打开cmd窗口,定位到UnityJarSDK目录下分别输入以下三行命令:
javac -encoding UTF-8 src/com/qtc/test/*.java -d out/
cd out
jar cvf unitysdk.jar com/qtc/test/*
第一行命令将java文件生成class文件,并输出到out目录下。由于MyMain所在的包从com目录开始,所以out下的目录结构会如下:
之后用jar在out下面生成所需要的jar文件即可,正确的输出应该类似于:
jar文件注入Unity工程
新建一个Unity工程,将jar文件存放到Assets/Plugins/Android/下。这里为了调用这个接口,我新建了一个Button和一个Text,Button点击之后,会调用jar的接口,然后将返回值输出的到Text中。Button的Onclick函数如下:
// 这里在前面定义了 public Text info;
public void BtnOnClick()
{
string className = "com.qtc.test.MyMain";
AndroidJavaClass jc = new AndroidJavaClass(className);
try
{
string ret = jc.CallStatic<string>("HelloWorld");
info.text = "Static Method Return: " + ret;
AndroidJavaObject jo