unity与android交互-2.c#调用java代码

Posted mr.chenyuelin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了unity与android交互-2.c#调用java代码相关的知识,希望对你有一定的参考价值。

制作jar包

创建一个java module,两种方式

第一种:
点击File->new Module,选择anroid Library
在这里插入图片描述
第二种:
直接新建一个空项目,修改build.gradle里的内容
在这里插入图片描述
在这里插入图片描述
就是把plugins的id改为com.android.library,android里处这两行其余内容删掉,然后点击sync

就会发现我们的项目变成了java module
在这里插入图片描述
这里在包下新建test类,写个java测试代码,待会供c#调用

package com.example.testunity;

import android.util.Log;

public class Test {
    public  static  String LOG="LOG";
    public  String name;
    public  static  void SetLOG(String log)
    {
        LOG=log;
        Log.d(LOG,"setLOG:"+log);
    }
    public  static String GetLOG()
    {
        Log.d(LOG,"GetLOG:"+LOG);
        return LOG;
    }
    public void SetName(String name)
    {
        this.name=name;
        Log.d(LOG,"SetName:"+name);
    }
    public String GetName()
    {
        Log.d(LOG,"GetName:"+name);
        return this.name;

    }
}

然后点击Build->make project

将Android改为Project,在app下会生成build文件夹,我们生成的jar就是图中所示
在这里插入图片描述
buid文件夹里,我们就关心libs_directory文件夹和main_jar文件夹
libs_directory:里依赖的一些库
main_jar:项目的jar包

最后在unity中新建Plugins文件夹,将classes.jar放进去即可
在这里插入图片描述

jar包是沟通c#和java的桥梁

c#调用java代码

c#代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TestCallJava : MonoBehaviour
{
    //AndroidJavaClass是用来访问静态的成员
    AndroidJavaClass javaClass = null;
    //AndroidJavaObject是访问普通成员
    AndroidJavaObject javaObject = null;
    // Start is called before the first frame update
    void Start()
    {
        javaClass = new AndroidJavaClass("com.example.testunity.Test");
        javaObject = new AndroidJavaObject("com.example.testunity.Test");
        
    }
    //访问普通成员方法
    public void click()
    {
        //泛型为返回值,括号为方法名
        string s1 = javaObject.Call<string>("GetName");
        //第一个参数为方法名,第二个为参数列表
        javaObject.Call("SetName", "456");

    }
    //访问静态成员方法
    public void onclick2()
    {
        string s2Static = javaClass.CallStatic<string>("GetLOG");
        javaClass.CallStatic("SetLOG", "android");
    }
    //访问普通成员变量
    public void onclick3()
    {
        string s = javaObject.Get<string>("name");
        javaObject.Set("name", "123");
        
    }
    //访问静态成员变量
    public void onclick4()
    {
        string staticStr = javaClass.GetStatic<string>("LOG");
        javaClass.SetStatic("LOG", "ios");
    }
    // Update is called once per frame
    void Update()
    {
        
    }
}

自己随便搞4个按钮,供测试

打包为apk然后在模拟器上运行,记得模拟器要连接android studio

然后点击按钮测试一下
在这里插入图片描述
这样就调用成功了

java调用c#代码

找到编辑器这个路径下C:\\softs\\unity\\Editor\\2020.1.17f1c1\\Editor\\Data\\PlaybackEngines\\AndroidPlayer\\Variations\\mono\\Release\\Classes\\classes.jar包放到libs文件夹下
在这里插入图片描述
右键这个jar包点击add this library选择哪一个android项目添加unity类库,然后jar包下会出现3个文件夹
在这里插入图片描述

然后就可以在java程序里添加unitySendMessage方法

public  static  void SetLOG(String log)
    {
        LOG=log;
        Log.d(LOG,"setLOG:"+log);
        //第一个参数为挂载脚本的物体名字,第二个为方法名,第3个为参数列表
        UnityPlayer.UnitySendMessage("Main Camera","test","");
    }

当c#调用java的setlog方法,UnitySendMessage会找到对应的场景

public void test()
    {
        text.text = "hello";
    }

同样的要build project,然后把jar放进unity项目,然后打包成apk,打开模拟器测试

以上是关于unity与android交互-2.c#调用java代码的主要内容,如果未能解决你的问题,请参考以下文章

Unity与 SO 交互 ☀️| 详细讲解 怎样通过 Android Studio 生成一个.so文件 并简单调用!

unity3d与android交互的sdk怎么接

unity与android交互相关资料整理(U2A)

Unity与Android Studio互相调用

Unity与安卓交互心得

关于iOSAndroid的交互 实践篇——主动调用