将 C# DLL 导入 C++ 以用于 JNI

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

本文关键字:用于 JNI C++ 导入 DLL      更新时间:2023-10-16

我正在用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++,直接从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,并使用 JNIRegisterNatives为该方法提供回调bar()并相应地调用 DLL。

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

  • Java 端方法:https://github.com/apache/ignite/blob/master/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/callback/PlatformCallbackUtils.java
  • C# 端实现在RegisterNatives中提供: https://github.com/apache/ignite/blob/master/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Unmanaged/Jni/Callbacks.cs#L120
  • C#也可以调用任何Java类/方法:https://github.com/apache/ignite/blob/607cdb0dafe8cb8c6595ab776b66a1a25cba018d/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Unmanaged/Jni/Env.cs#L126

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

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