Unity 调用Java | 调用aar包 | 调用jar包 | Java内部类,附带实例,看我一篇就够啦~

🚀 你生命的前半辈子或许属于别人,活在别人的认为里。

🌞 那便把后半辈子还给你自己,去追随你内在的声音。

请热爱生活,更热爱自己,不要在弥留之际才后悔,这一生过的是那样无趣。


1️⃣把java文件/aar包/jar包,放在Plugins目录下

  • 在Assets目录下,如果没有Plugins目录,请自行创建
  • 该目录是Unity特殊文件夹之一,用于存放第三方代码库,例如.dll、.aar、.jar等。

注意:该文件夹只能存在一个,且必须创建在Assets的根目录下!!


2️⃣选用合适的接口,调用java中你需要的功能

⭕调用静态函数&静态字段

//读取一个java类(此时该类并非是一个实例)
AndroidJavaClass javaClass = new AndroidJavaClass("包名,com.xxx.xxx.xxx");
//静态函数(无返回值)
javaClass.CallStatic("函数名");
//静态函数(普通返回值)
int num = javaClass.CallStatic<int>("函数名");
//静态函数(java类型返回值)
AndroidJavaObject jObj = javaClass.CallStatic<AndroidJavaObject>("函数名");

//静态字段(读取)
int staticParam = javaClass.GetStatic<int>("字段名");
//静态字段(设置)
javaClass.SetStatic<int>("字段名", value);
  •  AndroidJavaClass,用于读取一个Java类,但不是实例
  • 根据 是否有返回值、返回值的类型,决定了调用时的写法,请注意看代码注释

⭕调用成员函数&成员变量

//实例化一个类(带参数)
AndroidJavaObject jObj1= new AndroidJavaObject("com.xxx.xxx.xxx", 参数1, 参数2, 参数n);
//实例化一个类(不带参数)
AndroidJavaObject jObj2= new AndroidJavaObject("com.xxx.xxx.xxx");

//调用成员函数(有无返回值规则和静态规则一样,不赘述了)
AndroidJavaObject result1 = jObj1.Call<AndroidJavaObject>("函数名", 参数1, 参数2, 参数n);

//成员字段(设置)
jObj1.Set<string>("字段名", value);
//成员字段(获取)
string param1 = jObj1.Get<string>("字段名");
  •  AndroidJavaObject,用于实例化一个Java类!
  • 实例化时,可根据构造函数是否含参,来传递对应数量的参数。
  • 对于成员函数的调用写法(是否有返回值),与调用静态函数类似,不赘述了~
  • 在查看代码时,请注意看代码注释

⭕特殊!调用Java内部类

注意!!

  • 对于不同的Java内部类,存在不同的调用规则,这里只介绍成员内部类&静态内部类的调用方法。
  • 想要正确使用内部类(SDK的也好,自己写的也罢),请务必弄清楚,你想调用的内部类属于哪一种!!否则,后面出现的bug会让你摸不到头脑哦~
  • 感兴趣的胖友,可以看下面这个文章,只需要大概看一眼即可。
  • 搭嘎!不感兴趣的胖友,也可以看我的总结:
    • 静态内部类可以直接实例化,也可以正常调用其内部静态函数,除了需要加个$符号以外,其他的就当作普通类即可
    • 成员内部类不可以包含静态成员必须先实例化外部类,才能实例化自身,推荐在外部类写一个函数,可通过该函数new一个内部类的实例,会方便很多。

💢静态内部类

  • java代码
public Class JavaClass{
    public static int exampleParam1 = 12;
    
    //我是静态内部类
    public static Class JavaInnerClass{
        //静态/非静态成员都能放
        int x = 0;
        static int stX = 1;

        //我是成员函数
        public int ExampleFunc(){
            return x;
        }
        //我是静态函数
        public static String GetStaticResult(){
            return "hhh";
        }
    }
}
  • C#调用代码
public void YoyoTest(){
    //获取内部类实例
    AndroidJavaObject javaInnerIns = new AndroidJavaObject("com.test.unitytest.JavaClass$JavaInnerClass");
    //获取内部类
    AndroidJavaClass javaInner = new AndroidJavaClass("com.test.unitytest.JavaClass$JavaInnerClass");
}

看见那个$了嘛!看见那个$了嘛!看见那个$了嘛!!

除了这个符号以外,其他的就当作普通类食用即可。


💢成员内部类 

  • Java代码
public Class JavaClass{
    //随便搞的一个字段
    public static int exampleParam1 = 12;
    
    //外部类实现一个实例化内部类的函数
    public JavaInnerClass GetInnerClassIns(){
        return new JavaInnerClass();
    }
    
    //我是成员内部类
    public Class JavaInnerClass{
        //只能放非静态成员
        int x = 0;

        public int ExampleFunc(){
            return x;
        }
    }
}
  • C#代码
public void YoyoTest(){
    AndroidJavaObject javaIns = new AndroidJavaObject("com.test.unitytest.JavaClass");

    //获取内部类实例
    AndroidJavaObject javaInnerIns = javaIns.Call<AndroidJavaObject>("GetInnerClassIns");
}

这里没有$啊!别混淆了啊!

如果有铁头娃想要不通过我的方法获取内部成员类,请务必告诉我怎么做,因为我也不会哈哈哈~


 3️⃣实战代码

  • Java代码
package com.jimmy.unitytest;

public class YoYoCat {
    //种群名
    public static String RaceName = "YoYoCat";
    //爱好
    private static String CocoaHobbit = "Sleep";
    //个体名
    private String UnitName;

    //有参构造函数
    public YoYoCat(String name){
        UnitName = name;
    }
    //静态函数:获取爱好
    public static String GetYoYoCatHobbit(){
        return CocoaHobbit;
    }
    //成员函数:获取个体名
    public String GetYoYoCatUnitName(){
        return UnitName;
    }

    //外部类获取内部类实例的方法
    public YoYoCatChild GetChildIns(){
        return new YoYoCatChild();
    }
    //成员内部类
    public class YoYoCatChild{
        //随便写个属性&方法(不可以是静态的)
        public String childName = "Child";
        public String GetChildName(){
            return childName;
        }
    }

    //静态内部类
    public static class StaticYoYoCatChild{
        //可以是静态的也可以是非静态的
        public int GetANumber(){
            return 777;
        }
    }
}
  •  C#代码
public static void YoYoTest()
{
    //Java类读取
    AndroidJavaClass yoyoClass = new AndroidJavaClass("com.jimmy.unitytest.YoYoCat");
    //Java类实例化
    AndroidJavaObject yoyoIns = new AndroidJavaObject("com.jimmy.unitytest.YoYoCat", "YoYo01", 12);
    
    //静态字段读取
    string raceName = yoyoClass.GetStatic<string>("RaceName");
    Log.Info("[YoYo]静态字段读取:" + raceName);
    //静态函数调用
    string hobbit = yoyoClass.CallStatic<string>("GetYoYoCatHobbit");
    Log.Info("[YoYo]静态函数调用:" + hobbit);
    //成员函数调用
    string unitName = yoyoIns.Call<string>("GetYoYoCatUnitName");
    Log.Info("[YoYo]成员函数调用:" + unitName);
    
    //Java内部成员类实例化
    AndroidJavaObject yoyoChildIns = yoyoIns.Call<AndroidJavaObject>("GetChildIns");
    //成员字段读取
    string yoyoChildInsName = yoyoChildIns.Call<string>("GetChildName");
    Log.Info("[YoYo]成员字段读取:" + yoyoChildInsName);
    
    //Java内部静态类实例化
    AndroidJavaObject yoyoStaticChildIns = new AndroidJavaObject("com.jimmy.unitytest.YoYoCat$StaticYoYoCatChild");
    //看看是否成功实例化
    Log.Info("[YoYo]内部静态类测试:" + yoyoStaticChildIns.Call<int>("GetANumber"));
}
  •  结果

 注意:Log.Info是我自己封装的,如果要实验,请使用Debug.Log;

需要打包测试,Editor环境下是无法看到结果的。


 4️⃣结束语

  • 如文章有错误,十分非常特别欢迎大家指出,共同进步~
  • 第一次尝试这种排版风格,看起来还不错,以后也这么排版吧,嗯!
  • 💗嘤嘤嘤,给个赞好不好🧡,每次看到几K阅读但0赞,就总感觉我是不是文章写错了。。。
  • 作者纯纯是用爱发电,没有收益,有赞就感觉吧,嗯,很开心~
  • 10
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值