让JNA使用Java => C#?

Sha*_*ica 6 c# java jna

我在C#库中编写了很多代码,我现在需要从Java调用它.

我在SO上建议使用JNA,但是我甚至无法摆脱起跑线; 那里的文件非常粗略.

首先,它似乎只是告诉你如何连接到Native C库,这对我没有好处; 我想连接到我自己的库.代码示例显示:

// This is the standard, stable way of mapping, which supports extensive
// customization and mapping of Java to native types.
public interface CLibrary extends Library {
    CLibrary INSTANCE = (CLibrary)
        Native.loadLibrary((Platform.isWindows() ? "msvcrt" : "c"),
                           CLibrary.class);

    void printf(String format, Object... args);
}
Run Code Online (Sandbox Code Playgroud)

我想连接到我的库(MyLibrary.dll),并调用MyNamespace.MyClass其C#签名为的静态方法:

public static string HelloWorld(string p)
Run Code Online (Sandbox Code Playgroud)

那么我给出的参数是什么Native.loadLibrary()

那只是为了"Hello World".如果我想要返回一个对象怎么办?我们说MyClass也有一个静态方法

public static MyClass GetInstance()
Run Code Online (Sandbox Code Playgroud)

我如何使用JNA调用它?我想我必须定义在Java中,在C#相匹配的接口MyClass界面...但它必须是详尽的,即对于每一个公共的成员MyClass,我将不得不宣布在一个方法IMyClass的Java接口?或者我可以省略我不关心的界面?

欢迎任何示例代码!

Mic*_*ker 11

您将无法直接从Java调用C#代码.JNA只能访问本机库(C或C++).但是,您可以在库中启用COM Interop,并将2与本机包装器链接在一起.即它会看起来像:

Java --(JNA)--> C/C++ --(COM Interop)--> C#

有几种选择:

  • 使C#成为一个独立的命令行应用程序,让Java代码使用stdin/stdout从它发送/接收数据(ProcessBuilder可以在这里帮助你).
  • 使用某种形式的平台中立消息传递协议将C#作为独立应用程序运行,以在它们中的两个之间进行通信,例如HTTP,AMQP.

  • @mbx:它就是这样,但Michael Barker在简洁地描述选项方面做得很好.+1给他. (4认同)