Java可以接收和调用从另一种语言接收的静态方法的委托吗?

时间:2017-11-03 08:02:52

标签: java c# objective-c unity3d delegates

例如,在C#中我有

[MonoPInvokeCallback(typeof(PointDelegate))]
public static void Callback(int x, int y)
{ .... }

此方法存储在签名return void(int,int)的委托中。

public delegate void PointDelegate(int x, int y);

我将此委托变量发送到Objective-C,然后在那里我可以直接调用它来调用Callback()。它只是有效。 (我已在Objective-C方面宣布等效的typedef来匹配)

C#

objC(Callback);

目标-C

typedef void (*PointDelegate)(int x, int y);
void objC(PointDelegate delegateFromCSharp)
{
   delegateFromCSharp(1,2);
}

Java中的等价物是什么?假设我已经可以在Java中调用一个方法并且委托作为唯一参数传递,那么该Java方法的签名是什么?以及如何调用收到的代表?

1 个答案:

答案 0 :(得分:0)

我设法让它发挥作用。这个解决方案使用Unity的"AndroidJavaProxy"类,所以我不确定它将使用纯JNI。但我很高兴它适用于我的情况。

这是C#:

public class IntInterface : AndroidJavaProxy
{
    public IntInterface() : base("com.YourCompany.YourApp.YourClass$IntInterface") { }
    void Call(int i)
    {
        Debug.Log("Java says : " + i);
    }
}

然后我用Java new IntInterface()作为参数调用静态方法。

在Java端,我有一个匹配的接口等待。它可以接受来自C#端的IntInterface而不再抛出JNI : unknown signature for typeCall也与C#匹配。

    public static void StaticMethod(IntInterface intInterface) {
        intInterface.Call(555);
    }

    @FunctionalInterface
    public static interface IntInterface{
        void Call(int i);
    }

结果是"Java says : 555"我刚用Java中的参数调用了C#方法Call(int i)