一、04、unity两种方式调用Android的jar包方法

一、用Android Studio打出jar包供Unity调用

1.创建新的 Android Studio 工程
2.为此 Android Studio 工程创建 Android Library 类库(也就是一个 Module)(后面就是用它生成 jar)
3.生成 Jar
4.将 jar 导入 Unity 工程中的 Assets/Plugins/Android/
5.使用 AndroidJavaObject.Call 等方式调用

参照这个教程:https://www.jianshu.com/p/8256c0da444a
但是不要用最新的Android Studio版本,要和教程的保持一致,不然生成的jar包的文件夹都找不到,根本就没有。

这个当中还遇到别的问题,比如打开新建工程,上来就报错,后面百度后是因为
Android Studio构建版本和生成的目标版本不对应问题。

二、Unity调用jar内方法的两种方式

  • 1、基本调用方法-单例模式
    unity是通过UnityPlayer这个中间类和jar通信的,所以要先实例一个UnityPlayer。
    用静态方法获取jar端的实例,然后通过实例来调用Jar端的方法。
    其中可以通过回调的方式互相通信发消息。
    image.png

    安卓端编写接口:
    image.png

    调试结果:
    image.png
  • 2、使用unity提供的AndroidJavaProxy(接口)方式
    主要流程:
    (1)安卓端实现接口,该接口可以带回调
    (2)unity端C#代码,继承AndroidJavaProxy类,并实现安卓端的接口
    (3)unity调用安卓接口
    伪代码
   ListenVoiceCallBack listenVoiceCallBack;
   listenVoiceCallBack = new ListenVoiceCallBack();
   jo.Call<如果有返回值写在这里>("安卓提供的方法名", listenVoiceCallBack);

    //安卓提供的语音识别
    public class ListenVoiceCallBack : AndroidJavaProxy
    {
        //安卓提供的基类,限制传入了参数的写法
        public ListenVoiceCallBack() : base("com.dmai.listener.IASREventListener")
        {
            Debug.Log("has ListenInit");
        }
        
        //得到音量
        public void volumeChange(int volume)
        {
            Debug.Log("音量:" + volume);
        }
        
        //得到识别的语音内容
        public void asrResult(string result, string errorInfo, bool isFinal, bool isError)
        {
            Debug.Log("------result:" + result);
            Debug.Log("------errorInfo:" + errorInfo);
            Debug.Log("------isFinal:" + isFinal);
            Debug.Log("------isError:" + isError);
        }
    }
安卓端伪代码
package com.dmai.listener;
public interface IASREventListener{
    public void onSuccess(String videoPath);
    public void onError(String errorMessage);
}

public void myIASREventListener(IASREventListener callback) {
    // Do something
    callback.onSuccess("onSuccess");
    // Do something horrible
    callback.onError("onError");
}

用类的实例传递,最大的好处是替代了回调,并且规定了回调的形式。

  • 4、需要注意的点
    Unity使用安卓的调用方法时除非方法值返回值本身就是void,否则必须要写上。有时候不知道安卓这边方法的返回值类型是什么,可以将打出来的包拿到Android Studio里查看。如图:


    image.png

    可以看到addAsrListener这个方法是布尔值类型的返回值。

通常Unity需要在安卓做哪些事情?

  • 调节系统音量
  • 调节屏幕亮度
  • 获取摄像机
  • 获取震动
  • 串口
  • 手机上一些内置功能,如相册,语音录制等
  • 外部串口
  • 外部库功能,比如智能语音,智能图片识别等
    把坑提出来,后续有多一些空余时间会把这些坑填上。

真机调试apk

工具:Android Studio自带logcat或者mlogcat
传输安装:网络、U盘、adb

Unity技术博文目录

你可能感兴趣的:(一、04、unity两种方式调用Android的jar包方法)