首页 > 解决方案 > 将 C# DLL 导入 C++ 以与 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"

我以这种方式包含/使用或对 DLL 的使用做出任何不正确的假设?我将如何解决此错误?

标签: c#c++dlljava-native-interfaceinclude

解决方案


您可以避免使用 C++ 并从 Java 调用 C# 并直接返回,但您必须从 C# 端引导整个过程:

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

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

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

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


推荐阅读