2017-03-08 26 views
0

jni4netライブラリを使用してC#イベントをJavaコードから購読する方法をテストしていますが、これまでの例はありません。私は、イベントが発生したときにBody()オブジェクトの配列を送信しようとしています。Jni4net、Javaで使用するためにC#イベントを定義する方法

C#コード:

public class LibEventHandler 
{ 

    // Event for updating the body frame 
    public delegate void UpdateBodyFrameEventHandler(object source, BodyDataEventArgs e); 
    public event UpdateBodyFrameEventHandler UpdateBody; 
    protected virtual void OnUpdateBody(BodyDataEventArgs bodies) 
    { 
     UpdateBodyFrameEventHandler handler = UpdateBody; 
     if (handler != null) 
      handler(this, bodies); 
    } 
    public void raiseUpdateBodyEvent(Body[] bodies) 
    { 
     OnUpdateBody(new BodyDataEventArgs() { Bodies = bodies }); 

    } 

} 

/// <summary> 
/// A class extending EventArgs. Specifies the type Body[] as the event argument for the UpdateBody event 
/// </summary> 
public class BodyDataEventArgs : EventArgs 
{ 
    public Body[] Bodies { get; set; } 
} 

Javaコード:

public Start(){ 
    //initialise jni4net 
    try { 

     Bridge.setVerbose(true); 
     Bridge.init(); 

     Bridge.LoadAndRegisterAssemblyFrom(new File("testlib.j4n.dll")); 

    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    //create a instance of the library's main class and get the object that has all the events 
    LibMain lib = new LibMain(); 
    LibEventHandler evHandler = lib.getEventHandler(); 

    //subscribe to the event UpdateBody 
    evHandler.addUpdateBody(new EventHandler(){ 
     @Override 
     public void Invoke(system.Object sender, EventArgs e){ 
      Hello(); 
     } 
    }); 
} 


private void Hello(){ 
    System.out.println("Hello World! triggered by c# event"); 
} 

Java側は、まだC#のイベントによって指定された引数を使用しませんが、私はちょうどそれがトリガーされますかどうかを確認したかったですまったく。同じ例外が別のウェブサイト(下記リンク)上で議論されたが、私のイベントを定義するときに、私の知る限り、私は任意のジェネリックを使用していない

Exception in thread "main" System.ArgumentNullException: Value cannot be null. 
Parameter name: method 
    at System.Delegate.CreateDelegate(Type type, Object firstArgument, MethodInfo method, Boolean throwOnBindFailure) 
    at System.Delegate.CreateDelegate(Type type, Object firstArgument, MethodInfo method) 
    at net.sf.jni4net.utils.Convertor.StrongJ2CpDelegate[TRes](JNIEnv env, JniLocalHandle obj) 
    at testlib.__LibEventHandler.UpdateBody0(IntPtr __envp, JniLocalHandle __obj, JniLocalHandle value) 
    at testlib.LibEventHandler.addUpdateBody(Native Method) 
    at testing.Start.<init>(Start.java:35) 
    at testing.Testing.main(Testing.java:24) 

:しかし、これは、次の例外がスローされます。誰かが私が間違って行ったことを知っていますか?

MulticastDelegate for asynchronous callback from Java to DotNet

答えて

0

ことが判明したように、JNI4NETはませサポートデリゲートのイベントを行います。そこで、解決策は、Java側のリスナーとのインタフェースイベントシステムを使用することでした。

関連する問題