将 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# 端进行整个调用:
- 在您的 Java 程序中创建一个 class 并公开一个 JNI 方法:
public class Foo {
static native void bar(); // This method will be implemented in C#
}
- 将Java程序编译成JAR文件
- 用 C# 编写一个“bootstrap”程序加载 DLL,在 classpath 中使用 JAR 启动进程内 JVM,并使用 JNI
RegisterNatives
提供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
RegisterNatives
中提供了 C# 端实现:https://github.com/apache/ignite/blob/master/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Unmanaged/Jni/Callbacks.cs#L120
- C# 也可以调用任何 Java class/method: https://github.com/apache/ignite/blob/607cdb0dafe8cb8c6595ab776b66a1a25cba018d/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Unmanaged/Jni/Env.cs#L126
您可以根据需要随意复制和修改此代码,Apache 许可证允许这样做。
整个事情相当复杂,但它是最高效的方法。唯一的选择是 运行 .NET 和 Java 在不同的进程中使用管道或其他一些机制进行通信。
我正在 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# 端进行整个调用:
- 在您的 Java 程序中创建一个 class 并公开一个 JNI 方法:
public class Foo {
static native void bar(); // This method will be implemented in C#
}
- 将Java程序编译成JAR文件
- 用 C# 编写一个“bootstrap”程序加载 DLL,在 classpath 中使用 JAR 启动进程内 JVM,并使用 JNI
RegisterNatives
提供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
RegisterNatives
中提供了 C# 端实现:https://github.com/apache/ignite/blob/master/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Unmanaged/Jni/Callbacks.cs#L120- C# 也可以调用任何 Java class/method: https://github.com/apache/ignite/blob/607cdb0dafe8cb8c6595ab776b66a1a25cba018d/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Unmanaged/Jni/Env.cs#L126
您可以根据需要随意复制和修改此代码,Apache 许可证允许这样做。
整个事情相当复杂,但它是最高效的方法。唯一的选择是 运行 .NET 和 Java 在不同的进程中使用管道或其他一些机制进行通信。