unity 和Android 交互 (sdk接入)

unity 调用安卓

首先调用是普通的方法

------java代码 安卓类

package com.yc.adplatform;

public class AdPlatformSDK {

    public static AdPlatformSDK sInstance;

    public static AdPlatformSDK getInstance(Context context) {
        if (sInstance == null) {
            synchronized (AdPlatformSDK.class) {
                if (sInstance == null) {
                    sInstance = new AdPlatformSDK(context);
                }
            }
        }
        return sInstance;
    }
 private AdPlatformSDK(Context context) {
       MMKV.initialize(context); 
    }
}
如何在unity 中调用上面这个类呢?

c#


   using System;
   using UnityEngine;
   public class SDKMgr
   {
   
   private AndroidJavaObject _mAdplatormSDK;
   private AndroidJavaObject _unityPlayer;
   public void Init()
   {
     var unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
      _unityPlayer = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
     var jc = new AndroidJavaClass("com.yc.adplatform.AdPlatformSDK");
     _mAdplatormSDK = jc.CallStatic<AndroidJavaObject>("getInstance", _unityPlayer);
     //这里的getInstance代表上面java代码中public static AdPlatformSDK getInstance(Context context)中的方法名字_unityPlayer 这个代表是参数Context 
     
   }
  }

如何传递接口参数
java代码

 package com.yc.adplatform.ad.core;
    public interface InitCallback {
        void onSuccess();  

        void onFailure();

        void onAdInitSuccess(); 

        void onAdInitFailure(); 
    }

C#接口

//和上面的java对应 也就是重写
public interface IUnityInitCallback 
{
    void onSuccess(); 

    void onFailure();

    void onAdInitSuccess(); 

    void onAdInitFailure(); 
}

这个是接口类

//
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class UnityInitCallback : AndroidJavaProxy
{
    private readonly IUnityInitCallback listener;
    public UnityInitCallback(
        IUnityInitCallback listener)
        : base("com.bytedance.sdk.openadsdk.AdPlatformSDK$InitCallback")
    {
        this.listener = listener;
    }

    public void onSuccess()
    {
        InterfaceMgr.PostTask(() =>  this.listener.onSuccess());
    }

    public void onFailure()
    {
        InterfaceMgr.PostTask(() => this.listener.onFailure());
    }

   public void onAdInitSuccess() // 广告初始化成功
    {
        InterfaceMgr.PostTask(() => this.listener.onAdInitSuccess());
    }

   public void onAdInitFailure()// 广告初始化失嵊
    {
        InterfaceMgr.PostTask(() => this.listener.onAdInitFailure());
    }
}

接口管理器


  public class InterfaceMgr: MonoBehaviour
    {
        private static InterfaceMgrinstance;

        // The thread safe task queue.
        private static List<Action> postTasks = new List<Action>();

        // The executing buffer.
        private static List<Action> executing = new List<Action>();

        private static InterfaceMgrInstance
        {
            get
            {
                CheckInstance();
                return instance;
            }
        }

        /// <summary>
        /// Work thread post a task to the main thread.
        /// </summary>
        public static void PostTask(Action task)
        {
            lock (postTasks)
            {
                postTasks.Add(task);
            }
        }

        /// <summary>
        /// Start to run this InterfaceMgr.
        /// </summary>
        [RuntimeInitializeOnLoadMethod]
        private static void CheckInstance()
        {
            if (instance == null && Application.isPlaying)
            {
                var go = new GameObject(
                    "InterfaceMgr", typeof(InterfaceMgr));
                GameObject.DontDestroyOnLoad(go);

                instance = go.GetComponent<InterfaceMgr>();
            }
        }

        private void Awake()
        {
            GameObject.DontDestroyOnLoad(this);
        }

        private void OnDestroy()
        {
            postTasks.Clear();
            executing.Clear();
            instance = null;
        }

        private void Update()
        {
            lock (postTasks)
            {
                if (postTasks.Count > 0)
                {
                    for (int i = 0; i < postTasks.Count; ++i)
                    {
                        executing.Add(postTasks[i]);
                    }

                    postTasks.Clear();
                }
            }

            for (int i = 0; i < executing.Count; ++i)
            {
                var task = executing[i];
                try
                {
                    task();
                }
                catch (Exception e)
                {
                    Debug.LogError(e.Message, this);
                }
            }

            executing.Clear();
        }
    }


接口的具体实现转为对象 看代码使其可以使用new

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class InitCallbackListener : IUnityInitCallback
{
    private Action _InitFailurCall;
    private Action _InitSuccesscall;
    private Action _FailureCall;
    private Action _SuccessCall;
    public InitCallbackListener (Action InitFailurCall=null, Action InitSuccesscall=null, Action FailureCall =null, Action SuccessCall=null)
    {
        _InitFailurCall = InitFailurCall;
        _InitSuccesscall = InitSuccesscall;
        _FailureCall = FailureCall;
        _SuccessCall = SuccessCall;
    }

    public void onAdInitFailure()
    {
        _InitFailurCall?.Invoke();
        Debug.LogError("SDK初始化失败");
    }

    public void onAdInitSuccess()
    {
        _InitSuccesscall?.Invoke();
        Debug.LogError("SDK初始化成功");
    }

    public void onFailure()
    {
        _FailureCall?.Invoke();
        Debug.LogError("初始化失败");
    }

    public void onSuccess()
    {
        _SuccessCall?.Invoke();
        Debug.LogError("初始化成功");
    }
}


那么我们调用下面这个java也就是安卓代码
java代码

  public void init(final Context context, String appId, final InitCallback initCallback) {}

C#

    InitCallbackListener initCallbackListener = new InitCallbackListener();
    _mAdplatormSDK.Call("init", _unityPlayer, _appId, initCallbackListener);
   // 参数可以自己设置

其他的参数传递就比较简单了

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值