一, 准备工作
Ⅰ, JDK
建议别玩花哨, 直接用X64的JDK8
Ⅱ, SDK
直接下载Android Studio
Ⅲ, NDK
目前使用R19的最好, 反正试过R21的是不行的
配置如下
二, 用Unity打包
点击 "Build" 直接打出apk包
三, 使用Android Studio打包
Ⅰ, 勾选 "Export Project"来导AS项目
Ⅱ, 导出的AS项目结构:
Ⅲ, 使用Make Project来打包APK
四, C#与Java互调用
Ⅰ, 准备工作
1, 创建Android类库 略
2, 创建测试类 , 如下图
UnityTest.java代码:
package com.example.testunitylib;
import android.util.Log;
public class UnityTest {
public static String NAME = "Snow";
public String message;
public static void SetName(String name){
UnityTest.NAME = name;
Log.d(NAME, "SetName: " + name);
}
public static String GetName(){
Log.d(NAME, "GetName: " + UnityTest.NAME);
return NAME;
}
public void SetMessage( String message ){
this.message = message;
Log.d(this.message, "SetMessage: " + message);
}
public String GetMessage(){
Log.d(message, "GetMessage: " + this.message);
return this.message;
}
}
3, 构建类库
导出文件的位置:
注意, 本测试只需Java类库代码, 并不需要其他资源, 所以直接将app-debug.arr中的classes.jar放入到unity中就可以了
具体做法:
将app-debug.arr 命名为 app-debug.zip 解压后即可在文件夹得到
或着(但这里直接可以得到jar包),如下图
4, 将jar包放入到unity项目中
注意一定要放在Plugins文件夹下: 如
Ⅱ, C#调用Java
1, C#代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
/// <summary>
/// 测试C#调用Java
/// </summary>
public class TestCSharpCallJava : MonoBehaviour
{
public InputField txtSetName;
public InputField txtSetMessage;
public Text txtName;
public Text txtMessgae;
/// <summary>
/// 调用静态java
/// </summary>
private AndroidJavaClass androidJavaClass;
/// <summary>
/// 调用java对象
/// </summary>
private AndroidJavaObject androidJavaObject;
void Start()
{
this.androidJavaClass = new AndroidJavaClass("com.example.testunitylib.UnityTest");
this.androidJavaObject = new AndroidJavaObject("com.example.testunitylib.UnityTest");
}
// Update is called once per frame
void Update()
{
}
public void SetName(){
this.androidJavaClass.CallStatic("SetName", this.txtSetName.text);//调用Java静态方法 . 无返回值
}
public void SetMessage(){
this.androidJavaObject.Call("SetMessage", this.txtSetMessage.text);//调用Java实例对象方法 . 无返回值
}
public void GetName(){
this.txtName.text = this.androidJavaClass.GetStatic<string>("NAME");//获取Java静态的字段 , 或如下
// this.txtName.text = this.androidJavaClass.CallStatic<string>("GetName");//调用Java的静态方法
}
public void GetMessage(){
this.txtMessgae.text = this.androidJavaObject.Get<string>("message");//获取Java实例对象字段 , 或如下
// this.txtMessgae.text = this.androidJavaObject.Call<string>("GetMessage");//调用java实例对象方法
}
}
2, Scene
3, 结果
Ⅲ, Java调用C#
1, Android项目引用Unity提供的jar类库
位置为: unity安装位置下的 Editor/Data/PlaybackEngines/AndroidPlayer/Variations/mono/Release/Classes/classes.jar , 如下
a,将classes.jar放入Android类库下的libs文件夹下
b,添加为库
2,用UnityPlayer.UnitySendMessage调用C#
参数1 : 脚本所在的GO的名称 / 参数2 : 脚本中方法的名称 / 参数3: 方法参数
package com.example.testunitylib;
import android.util.Log;
import com.unity3d.player.UnityPlayer;
public class UnityTest {
/**姓名, 静态类型*/
public static String NAME = "Snow";
/**消息*/
public String message;
public static void SetName(String name){
UnityTest.NAME = name;
Log.d(NAME, "SetName: " + name);
UnityPlayer.UnitySendMessage("Canvas","GetName","");//调用 Canvas下 某脚本 GetName方法, 方法无参数
}
public static String GetName(){
Log.d(NAME, "GetName: " + UnityTest.NAME);
return NAME;
}
public void SetMessage( String message ){
this.message = message;
Log.d(this.message, "SetMessage: " + message);
UnityPlayer.UnitySendMessage("Canvas","GetMessage","");//调用 Canvas下 某脚本 GetMessage方法, 方法无参数
}
public String GetMessage(){
Log.d(message, "GetMessage: " + this.message);
return this.message;
}
}