Unity 调用Java | 调用aar包 | 调用jar包 | Java内部类,附带实例,看我一篇就够啦~
Posted 柚柚猫
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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赞,就总感觉我是不是文章写错了。。。
- 作者纯纯是用爱发电,没有收益,有赞就感觉吧,嗯,很开心~
Unity 调用 Android Native 方法 获得Android系统音量
学习雷锋,好榜样,接下来的这一系类教程里,将通过unity来实现Android端的一些常用功能,
不需要在 Asset/Plugins/Android 目录下引用jar包或者aar包,这是重点。
1 using System.Collections; 2 using System.Collections.Generic; 3 using UnityEngine; 4 5 public class Volume : MonoBehaviour { 6 7 8 private const string currentVolume = "getStreamVolume";//当前音量 9 private const string maxVolume = "getStreamMaxVolume";//最大音量 10 11 private const int STREAM_VOICE_CALL = 0; 12 private const int STREAM_SYSTEM = 1; 13 private const int STREAM_RING = 2; 14 private const int STREAM_MUSIC = 3; 15 private const int STREAM_ALARM = 4; 16 private const int STREAM_NOTIFICATION = 5; 17 const int STREAM_DTMF = 8; 18 19 //创建几个 "3D Text" 用于接收音量值 20 public TextMesh STREAM_VOICE_CALL_Text; 21 public TextMesh STREAM_SYSTEM_Text; 22 public TextMesh STREAM_RING_Text; 23 public TextMesh STREAM_MUSIC_Text; 24 public TextMesh STREAM_ALARM_Text; 25 public TextMesh STREAM_NOTIFICATION_Text; 26 public TextMesh STREAM_DTMF_Text; 27 28 29 private static AndroidJavaObject audioManager; 30 31 32 void Awake() 33 { 34 AndroidJavaClass UnityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); 35 AndroidJavaObject currentActivity = UnityPlayer.GetStatic<AndroidJavaObject>("currentActivity"); 36 audioManager = currentActivity.Call<AndroidJavaObject>("getSystemService", new AndroidJavaObject("java.lang.String", "audio")); 37 } 38 void Update() 39 { 40 // //current volume value 41 // STREAM_VOICE_CALL_Text.text = audioManager.Call<int> (currentVolume, STREAM_VOICE_CALL).ToString (); 42 // STREAM_SYSTEM_Text.text = audioManager.Call<int> (currentVolume, STREAM_SYSTEM).ToString (); 43 // STREAM_RING_Text.text = audioManager.Call<int> (currentVolume, STREAM_RING).ToString (); 44 // STREAM_MUSIC_Text.text = audioManager.Call<int> (currentVolume, STREAM_MUSIC).ToString (); 45 // STREAM_ALARM_Text.text = audioManager.Call<int> (currentVolume, STREAM_ALARM).ToString (); 46 // STREAM_NOTIFICATION_Text.text = audioManager.Call<int> (currentVolume, STREAM_NOTIFICATION).ToString (); 47 // STREAM_DTMF_Text.text = audioManager.Call<int> (currentVolume, STREAM_DTMF).ToString (); 48 49 //Max volume value 50 STREAM_VOICE_CALL_Text.text = audioManager.Call<int> (maxVolume, STREAM_VOICE_CALL).ToString (); 51 STREAM_SYSTEM_Text.text = audioManager.Call<int> (maxVolume, STREAM_SYSTEM).ToString (); 52 STREAM_RING_Text.text = audioManager.Call<int> (maxVolume, STREAM_RING).ToString (); 53 STREAM_MUSIC_Text.text = audioManager.Call<int> (maxVolume, STREAM_MUSIC).ToString (); 54 STREAM_ALARM_Text.text = audioManager.Call<int> (maxVolume, STREAM_ALARM).ToString (); 55 STREAM_NOTIFICATION_Text.text = audioManager.Call<int> (maxVolume, STREAM_NOTIFICATION).ToString (); 56 STREAM_DTMF_Text.text = audioManager.Call<int> (maxVolume, STREAM_DTMF).ToString (); 57 58 } 59 }
以上是关于Unity 调用Java | 调用aar包 | 调用jar包 | Java内部类,附带实例,看我一篇就够啦~的主要内容,如果未能解决你的问题,请参考以下文章