UM3L2——Unity中调用Android内容

本章代码关键字

1
2
3
4
5
6
7
8
9
AndroidJavaClass                    //安卓Java类,可以通过包名以及类名实例化
androidJavaClass.GetStatic<>() //获取安卓Java类对象的方法,需要传入参数
AndroidJavaObject //安卓Java类对象,通过它调用安卓的arr包内的内容
androidJavaObject.Get<>() //获取成员变量
androidJavaObject.Set<>() //设置成员变量
androidJavaObject.GetStatic<>() //获取静态变量
androidJavaObject.SetStatic<>() //设置静态变量
androidJavaObject.Call<>() //执行成员方法
androidJavaObject.CallStatic<>() //执行静态成员方法

准备工作

在Android Studio中的MainActivity​中加入测试用的成员变量

image

然后重新构建一次arr包

导入Android Studio生成的内容

在Unity中新建 Plugins/Android​ 插件文件夹
AndroidStudio​ 生成的内容 放入该文件夹中

  1. 导入aar包
  2. 导入AndroidManifest.xml​配置文件

在Unity中书写交互代码

固定写法如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
void Start()
{
//创建和Android通信的类信息
using (AndroidJavaClass ajc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
{
//获取当前Unity基于的Activity对象
//这里得到的对象就相当于是aar包中的MainActivity
using (AndroidJavaObject ajo = ajc.GetStatic<AndroidJavaObject>("currentActivity"))
{
//获取到MainActivity后 就可以调用其中的对应Java代码了
}
}
}

其中,ajo​就是arr包的MainActivity​对象,就可以调用其中对应的Java代码了

ajo​(MainActivity​)的变量相关:

  1. 成员变量的获取和设置

    • ajo.Get<变量类型>("变量名")
    • ajo.Set<变量类型>("变量名", 值)
  2. 静态成员变量的获取和设置

    • ajo.GetStatic<变量类型>("变量名")
    • ajo.SetStatic<变量类型>("变量名", 值)

ajo​(MainActivity​)的函数相关:

  1. 成员函数调用

    • 无返回值 ajo.Call("函数名", 参数)
    • 有返回值 ajo.Call<返回值类型>("函数名", 参数)
  2. 静态成员函数调用

    • 无返回值 ajo.CallStatic("函数名", 参数)
    • 有返回值 ajo.CallStatic<返回值类型>("函数名", 参数)

假设要调用如下的MainActivity​Java类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package com.taikr.mytestgame;

import android.os.Bundle;
import com.unity3d.player.UnityPlayerActivity;

public class MainActivity extends UnityPlayerActivity {
//用于测试的成员变量相关
public int testI;
public static int testStaticI = 20;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}

//用于测试的成员函数
public String TestFun() {
return "String";
}

//用于测试的静态成员函数
public static String TestStaticFun() {
return "TestStaticFun";
}
}

编写如下C#代码调用Java类,然后获取其变量,并执行方法,输出结果显示在UI上:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
using UnityEngine;
using UnityEngine.UI;

public class AndroidTest : MonoBehaviour
{
public Text txtOld;
public Text txtNew;
public Text txtStaticOld;
public Text txtStaticNew;
public Text txtTestFun;
public Text txtTestStaticFun;

void Start()
{
using (AndroidJavaClass javaClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
{
//当前这个JavaObj就代表MainActivity这个对象,我们可以通过它获取到其中的变量、方法
using (AndroidJavaObject javaObj = javaClass.GetStatic<AndroidJavaObject>("currentActivity"))
{
//成员变量的获取和改变
int i = javaObj.Get<int>("testI");
txtOld.text = i.ToString();
javaObj.Set<int>("testI", 11);
i = javaObj.Get<int>("testI");
txtNew.text = i.ToString();
//静态成员变量的获取和改变
int staticI = javaObj.GetStatic<int>("testStaticI");
txtStaticOld.text = staticI.ToString();
javaObj.SetStatic<int>("testStaticI", 21);
staticI = javaObj.GetStatic<int>("testStaticI");
txtStaticNew.text = staticI.ToString();

//调用有返回值的成员函数
string testFunStr = javaObj.Call<string>("TestFun");
txtTestFun.text = testFunStr;

//调用有返回值的静态函数
string testStaticFunStr = javaObj.CallStatic<string>("TestStaticFun");
txtTestStaticFun.text = testStaticFunStr;
}
}
}
}

以上的内容必须要在安卓的环境下才可以运行,因此需要挂载脚本后打包

打包注意事项

基础设置:

  1. 打包密钥设置
  2. Unity工程位于非中文路径

aar包设置(根据打包报错提示来处理,一般由以下几步需要处理):

首先用压缩软件打开arr包,对其中的内容进行处理:

image

  1. 删除aar包中 libs 下的 classes.jar,因为Unity会自带,避免重复报错

    image

  2. 删除aar包中 classes.jar 中的 UnityPlayerActivity.class,因为Unity会自带,避免重复报错

    image

  3. 删除aar包中 classes.jar 中的 BuildConfig.class,通过Unity打包不需要构建配置

    image

打包完毕,安装至真机或者模拟器上,查看效果:

Screenshot_20240402_213530_com.taikr.mytestgame