我有一个本机 Android 库,正在集成到 Unity 中,这需要我将 C# 委托传递给本机 SDK。作为一项设计决策,我将函数传递给本机 SDK,以便在发生各种事件时调用。我不知道如何将委托传递给本机代码,该本机代码将处理程序定义为类上的公共变量,如
var onMyEvent: () -> Unit = {}
。如何将 Unity C# 函数传递给生成的 setOnMyEvent
方法?
我在这个问题上遇到了困难,因为我仍在考虑 iOS 集成的函数指针。我尝试使用低级
AndroidJNI
函数来强制方法签名并从委托创建函数指针,但无济于事。然而,解决方案比我想象的要简单得多。查看反编译的AAR后,我意识到setOnMyEvent
函数需要一个Function0
参数,这是一个符合kotlin.jvm.functions.Function0
接口的对象,定义如下:
/** A function that takes 0 arguments. */
public interface Function0<out R> : Function<R> {
/** Invokes the function. */
public operator fun invoke(): R
}
使用这个,使用内置的 Unity
AndroidJavaProxy
类来实现是很简单的:
using UnityEngine;
// ...
class Function0 : AndroidJavaProxy {
private MyDelegate _callback;
public Function0(MyDelegate callback) : base("kotlin.jvm.functions.Function0") {
this._callback = callback;
}
public void invoke() { _callback(); }
}
在 Unity C# 包装类中,我需要做的就是以下操作:
public void SetOnMyEvent(MyDelegate callback) {
_myAndroidJavaObject.Call("setOnMyEvent", new Function0(callback));
}
我希望这可以帮助任何遇到类似问题的人,因为我找不到任何有关此主题的先前参考资料。我在这方面花费的时间比我愿意承认的要多。