2017-11-03 2 views
0

は、例えば、C#でIはJavaは、別の言語から受け取った静的メソッドの代理人を受け取り、呼び出すことができますか?

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

この方法は、署名戻りボイド(INT、INT)のデリゲートに格納されています。

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

私はObjective-Cのこのデリゲート変数を送って、そこの上に私はCallback()を呼び出すためにそれを直接呼び出すことができました。それだけで動作します。 (私が一致するのObjective-C側で同等のtypedefを宣言した)

C#

objC(Callback); 

のObjective-C

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

Javaで同等とは何ですか?私はすでにJavaでメソッドを呼び出すことができ、デリゲートが唯一のパラメータとして渡されていると仮定すると、そのJavaメソッドのシグネチャはどうなりますか?受信したデリゲートを呼び出す方法は?

+1

ネイティブと呼ばれます。スレッドの実装を見てくださいhttp://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/lang/Thread.java – Noixes

+1

Javaにはデリゲートの概念がありませんが、機能インタフェースとメソッド参照を使用することができます(https://stackoverflow.com/questions/39346343/java-equivalent-of-c-sharp-delegates-queues-methods-of-various-classes-to-be-exを参照) 。 –

答えて

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); 
    } 
} 

それから私は、パラメータとしてnew IntInterface()でのJavaの静的メソッドを呼び出します。

Java側では、一致するインターフェイスが待機しています。 JNI : unknown signature for typeを投げずにC#側からIntInterfaceを受け入れることができます。 CallもC#のものと一致しています。

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

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

結果は、私はちょうど、Javaからパラメータを指定してC#メソッドCall(int i)呼び出さ"Java says : 555"です。

関連する問題