【问题标题】:Jni4net, How to define C# events for use in JavaJni4net,如何定义 C# 事件以在 Java 中使用
【发布时间】:2017-03-08 13:56:21
【问题描述】:

我正在测试如何使用 jni4net 库从 Java 代码订阅 C# 事件,但到目前为止,我所做的示例都没有工作。我正在尝试在引发事件时发送一组 Body() 对象。

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

【问题讨论】:

    标签: java c# jni4net


    【解决方案1】:

    事实证明,JNI4NET 确实不支持委托事件。所以解决方案是在java端使用带有监听器的接口事件系统。

    【讨论】:

    • 如果可能的话,你能分享你的解决方案或一些代码吗?我被困在同一个地方。
    猜你喜欢
    • 2018-04-27
    • 2018-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-03
    相关资源
    最近更新 更多