将 C# DLL 导入 C++ 以便与 JNI 一起使用

Importing a C# DLL into C++ for use with JNI

我正在 Java 中编写一个程序,它必须使用 DLL 文件(用 C# 编写的),我认为最好的方法是编写一个 C++ 程序作为接口,并且然后使用 JNI。 C++ 程序将负责以 JNI 友好的方式使用 DLL,这样我就可以从我的 Java 程序中调用它。

我试图在 C++ 中包含一个 DLL 文件,但在编译时出现以下错误。

warning C4335: Mac file format detected: please convert the source file to either DOS or UNIX format

我包含所述 DLL 的方式:

#include "LibraryName.dll"

我 including/using 或对以这种方式使用 DLL 做出任何不正确的假设?我该如何解决这个错误?

您可以避免使用 C++ 并从 Java 调用 C# 并直接返回,但您必须 bootstrap 从 C# 端进行整个调用:

  1. 在您的 Java 程序中创建一个 class 并公开一个 JNI 方法:
public class Foo {
    static native void bar(); // This method will be implemented in C#
}
  1. 将Java程序编译成JAR文件
  2. 用 C# 编写一个“bootstrap”程序加载 DLL,在 classpath 中使用 JAR 启动进程内 JVM,并使用 JNI RegisterNatives 提供bar() 方法的回调并相应地调用您的 DLL。

请参阅 Apache Ignite.NET 代码作为跨平台示例。NET/Java 互操作:

您可以根据需要随意复制和修改此代码,Apache 许可证允许这样做。

整个事情相当复杂,但它是最高效的方法。唯一的选择是 运行 .NET 和 Java 在不同的进程中使用管道或其他一些机制进行通信。