c# - 将 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++ 并从 Java 调用 C# 并直接返回,但您必须从 C# 端引导整个过程:
- 在您的 Java 程序中创建一个类并公开一个 JNI 方法:
public class Foo {
static native void bar(); // This method will be implemented in C#
}
- 将Java程序编译成JAR文件
- 用 C# 编写一个加载 DLL 的“引导”程序,使用类路径中的 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
- 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,并使用管道或其他一些机制进行通信。
推荐阅读
- javascript - 如何在 HTML/D3 代码中对数据进行排序
- java - 在升序中没有得到双值的排序数组列表
- airflow - 如何在气流中更改 gunicorn 服务器的“保持活动”设置
- mysql - 如何在 Windows 中制作 Qt mysql 驱动程序?
- hadoop - 我们可以在 hive 中列出指向 hdfs 中特定位置的表吗?
- javascript - 数组数据在嵌套的异步箭头函数循环中丢失
- macos - 我可以在 docker 镜像中开发 react-native 应用吗
- c - 堆内存指针从结构内的指针字段中丢失
- java - 设置 DeferredResult setResult 方法后很晚才发回响应
- javascript - 遍历内部 DOM 元素并使用 Angular 2+ 替换内部 DOM