Unity调用jar包或者aar包

最近一直在做VR云会议,使用到了华为云会议的服务,华为云会议服务没有提供Unity版本的SDK,提供了Android版本的native sdk,那就自己只能在Unity中自己封装一层来调用Android接口。在这过程中,碰到了一些问题,做一下总结。

1、获取当前的Application或者当前的Activity

            using AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
            using AndroidJavaObject currentActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
            using AndroidJavaObject app = currentActivity.Call<AndroidJavaObject>("getApplication");

2、Android库的函数返回ArrayList,c#中如何转换呢?一般先返回AndroidJavaObject,然后把ArrayList转换成AndroidJavaObject[],最后在c#中遍历循环把数组中每个单元转换成你自己的结构体。

        public static AttendeeInfo ToAttendeeInfo(AndroidJavaObject attendeeObject)
        {
            AttendeeInfo attendeeInfo = new AttendeeInfo();

            attendeeInfo.setName(attendeeObject.Call<string>("getName"));
        }

        public List<AttendeeInfo> GetVideoAttendeeList()
        {
            using AndroidJavaObject attendeeListObj = IConfState.Call<AndroidJavaObject>("getVideoAttendeeList");
            if (attendeeListObj == null)
                return null;


            AndroidJavaObject[] objArray = attendeeListObj.Call<AndroidJavaObject[]>("toArray");

            List<AttendeeInfo> attendeeInfos = new List<AttendeeInfo>();
            foreach (var obj in objArray)
            {
                attendeeInfos.Add(AttendeeInfo.ToAttendeeInfo(obj));
            }

            return attendeeInfos;
        }

3、Android接口中,参数中有ArrayList参数,如何做呢?

先生存ArrayList的AndroidJavaObject,然后把C#每项转换成Android接口数组的每一项,调用add接口一个一个往里加。

        public SDKERR GeneralWatch(List<GeneralWatchItemParamEx> watchs)
        {
            using AndroidJavaObject watchList = new AndroidJavaObject("java.util.ArrayList");
            foreach (var watch in watchs)
            {
                watchList.Call<bool>("add", watch.ToXRAndroidJavaObject());
            }

            return SDKERR.ToSDKERR(IConfCtrl.Call<AndroidJavaObject>("generalWatch", watchList));
        }

4、参数中有回调函数,C#中如何传参呢?

在C#中生存一个class,指定继承AndroidJavaProxy。需要注意的是,回调接口在Android中只能是接口Interface,然后javaInterface就是android的路径。还有必须实现回调接口中的每个函数。基本类型可以直接匹配,如果是其他结构体,必须使用AndroidJavaObject。

    public class SdkCallback: AndroidJavaProxy
    {
        public readonly static string DEFALUT_JAVAINTERFACE = "com.huawei.hwmsdk.common.SdkCallback";
        public event Action<AndroidJavaObject> OnSuccess;
        public event Action OnFailed;

        public SdkCallback(string javaInterface) : base(javaInterface)
        {
        }

        public SdkCallback() : base(DEFALUT_JAVAINTERFACE)
        {
        }

        public void onFailed(AndroidJavaObject sdkerr)
        {
            SDKERR sDKERR = SDKERR.ToSDKERR(sdkerr);
            Debug.LogError("SdkCallback onFailed: " + sDKERR.ToString());

            OnFailed?.Invoke();
        }

        public void onSuccess(AndroidJavaObject var1)
        {
            OnSuccess?.Invoke(var1);
        }
    }

5、如何调用Android接口中enum类型呢?

AndroidJavaClass statuCodeClass = new AndroidJavaClass("com.huawei.huaweicloud.xrmeeting.rpc.core.RpcStatusCode");
AndroidJavaObject statusCode = statuCodeClass.GetStatic<AndroidJavaObject>("OK");

猜你喜欢

转载自blog.csdn.net/grace_yi/article/details/122668978