UnityAndroid 如何调用Android Java/Kotlin原生Api——①

781 阅读2分钟

① 在Android Studio新建一个工程,然后新建一个Module(Android Library)

工程Module取名 "cn.ololee.unityplugin"
Min SDK 最好指定API22,因为unity的默认的Min API 是22

image.png

②新建一个类PluginInstance

其对应的demo:

public class PluginInstance {

  public int add(int a, int b) {
    return a + b;
  }

  public static Activity unityActivity;

  public static void receiveUnityActivity(Activity activity) {
    unityActivity = activity;
  }

  public void toast(String msg) {
    Toast.makeText(unityActivity.getApplication().getApplicationContext(), msg, Toast.LENGTH_SHORT)
        .show();
  }
}

③ Build module & Generate aar

点击build module 生成debug的aar

image.png

其生成的aar将在工程对应的module dir(unityplugin)下的build/outputs/aar/ image.png

④保存aar到Unity工程

在我们的unity工程中,在Assets目录下新建一个Plugins的文件夹,在Plugins文件夹下继续新建一个Android的文件夹,然后将aar文件扔到这里面去

image.png

⑤使用aar

在层级中新建两个按钮 Add & Toast

image.png

image.png

新建一个C# Script

public class AndroidPlugin : MonoBehaviour
{
    private AndroidJavaClass unityClass;
    private AndroidJavaObject unityActivity;
    private AndroidJavaObject _pluginInstance;
    void Start()
    {
        //这里指定的就是之前的android 项目中的 包名 + 类名
        InitializePlugin("cn.ololee.unityplugin.PluginInstance");
    }

    void Update()
    {
        
    }

    void InitializePlugin(string pluginName)
    {
        /*
        新建 一个unityplayer 的 java class对象,其类名为com.unity3d.player.UnityPlayer
        这个class 有个静态属性,叫currentActivity,意为 当前活动 (游戏所在活动)
        然后通过反射调用便得到了该活动
        通过new AndroidJavaObject 可以获得一个我们自己的类PluginInstance 的对象
        然后通过反射receiveUnityActivity,为Toast的Context赋值,这里其实有其他方式获得context[可以参考 blankJ的各种 Utils]
        */
        unityClass = new  AndroidJavaClass("com.unity3d.player.UnityPlayer");
        unityActivity = unityClass.GetStatic<AndroidJavaObject>("currentActivity");
        _pluginInstance = new AndroidJavaObject(pluginName);
        if (_pluginInstance == null)
        {
            Debug.Log("=============== Plugin not found");
        }
        _pluginInstance.CallStatic("receiveUnityActivity", unityActivity);
    }

   /*
     Add方法和toast方法都是反射我们java的方法而已
   */
    public void Add()
    {
        if (_pluginInstance != null)
        {
            var result = _pluginInstance.Call<int>("add", 1, 2);
            Debug.LogFormat("=============== result:{0}", result);
        }
    }

    public void Toast()
    {
        if (_pluginInstance != null)
        {
            _pluginInstance.Call("toast", "Hi From Unity!!!");
        }
    }
}

UnityPlayer的源码:

其源码位置可以在unity的安装包的editor下找到 D:\unity\2022.1.15f1c1\Editor\Data\PlaybackEngines\AndroidPlayer

image.png

点击Toast按钮便可以调用android的方法了

⑥ 写在最后:

接下来会介绍如何在Unity android Client下使用自定义Activity,JNI,以及如何使用opencv等;