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);
// 参数可以自己设置
其他的参数传递就比较简单了

1588

被折叠的 条评论
为什么被折叠?



