【问题标题】:Importing a C# DLL into C++ for use with JNI将 C# DLL 导入 C++ 以与 JNI 一起使用
【发布时间】:2020-06-27 17:37:43
【问题描述】:

我正在用 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++ 调用 .net 库,除非它是托管 C++(不是这种情况)
  • 您不包含 dll 文件。您必须将它们保存在与可执行文件相同的目录中。我建议对 JNI 和 dll 进行一些谷歌搜索。

标签: c# c++ dll java-native-interface include


【解决方案1】:

您可以避免使用 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,并使用 JNI RegisterNativesbar() 方法提供回调并相应地调用您的 DLL。

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

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

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

【讨论】:

  • 非常好的答案,感谢您阅读问题并提出比我希望的更好的建议!
  • 我已经设法使用修改后的 Apache ignite 代码来使用我的 JAR 启动 JVM 并注册一个本地方法,请您解释一下我现在将如何运行 JAR 文件(调用 Main 方法)?截至目前,我有Jvm.GetOrCreate(options).AttachCurrentThread(),它返回一个 Env 对象。
  • @ChristianBenner 使用 JNI FindClass 检索您的课程,然后使用 GetStaticMethodId,然后使用 CallStaticVoidMethod。让我知道我是否应该准备一个工作示例。
  • 搞定了!非常感谢您的时间和帮助,我现在可以从我的 Java 应用程序中成功运行 C# 代码 :)
  • 太棒了!我知道要做到正确并不容易,很高兴听到它成功了:)
猜你喜欢
  • 1970-01-01
  • 2011-09-19
  • 2020-02-19
  • 1970-01-01
  • 1970-01-01
  • 2021-01-21
  • 1970-01-01
  • 2012-02-29
  • 1970-01-01
相关资源
最近更新 更多