【问题标题】:How to use .Net dll in Java如何在 Java 中使用 .Net dll
【发布时间】:2013-05-09 11:38:45
【问题描述】:

我在 vb.net 中创建了 dll。 如何在 JAVA 中使用它的功能。

我在 google 上搜索时发现了一些 JNI,但没有得到它。 有没有简单的示例文档。

【问题讨论】:

  • 老实说,我会说取决于 dll 的复杂性,如果代码不多的话,实际上可能值得复制 Java 中的功能。让 dll 与 Java 一起工作可能会更痛苦。

标签: java vb.net dll java-native-interface


【解决方案1】:

我会推荐Java Native Access (JNA),因为它比使用 JNI 更容易。假设您有一个包含一些功能的 DLL,

  • 创建一个与 DLL 中的函数具有相同方法签名的 java 接口。

例如

public interface NativeExample{

  public int method1(String param1);
  public boolean mehthod2();

}
  • 下面是你加载 DLL 的方式(假设它的名字是 NativeLib.dll)

    NativeExample nativeExample= (NativeExample) Native.loadLibrary("NativeLib", NativeExample.class);

一旦你有了这个,你可以通过java方法从DLL中调用方法。

`nativeExample.method("test");`

`nativeExample.method2();`

Java和Native的数据类型映射,请参考上面的链接。

这里是one more example

【讨论】:

  • 谢谢桑托什,我会试试你的解决方案。它似乎比 JNI 简单。
  • 它给我编译时错误找不到符号 Native。我应该导入哪个类?
  • 要导入的包是com.sun.jna.Native。请参考答案中的维基百科链接。
  • 我试过了,但我得到了这个错误“线程“主”java.lang.UnsatisfiedLinkError 中的异常:查找函数“GetStatus”时出错:找不到指定的过程。” GetStatus 是我的 DLL 中的函数
【解决方案2】:

除非您在这方面做了大量工作,否则 JNI 不会让您直接访问 .NET。您可以构建自己的包装器并使用 C/C++ 作为中间件,但对于小型项目,它永远不会得到回报。请记住,调用方法是一回事,但以正确的类型传递参数、检索结果、订阅事件等等等等。

因此,我还建议检查为此类场景做好充分准备的第三方工具。

首先至少检查以下两项:

我会向所有小型快速项目推荐 Javonet,因为这是一种轻量级的解决方案,由于过程中的通信而提供了非常高的性能,并且为您完成了所有后台工作。您只需要调用“AddReference(your.dll)”,然后使用反射式 API 调用任何方法。您可以调用任何方法、设置/获取字段和属性、获取结果、订阅事件或处理异常。

JNBridge 的工作方式非常相似,它为流行的企业场景(如云集成或 websphere)提供了更多的额外人员/扩展,但如果您希望在不同的机器上桥接 java 和 .net,我会推荐这个用于更大的项目强大但也更复杂和沉重。

两者均可免费试用,Javonet 可免费用于非商业和学术用途,因此请尝试、测试并选择最适合您的要求。

【讨论】:

    【解决方案3】:

    嗯,有第三方工具/库可以帮助您将 Java 连接到 .NET。如果你想自己做——意味着你自己实现 JNI 包装器——你实际上需要实现 2 套包装器。

    JNI 将带您使用 C/C++,不允许直接访问 .NET 对象。此时,您可以实现另一个包装器,即只有静态方法的 .NET 对象,您的 C/C++ 包装器可以调用它。由于非托管 C/C++ 代码不能拥有 .NET 对象,因此只能调用 .NET 类的静态方法。

    【讨论】:

    • 那些第三方工具是什么?
    • 很遗憾没有。我们正要评估几个产品,但后来决定自己用 JNI 实现它。是做一个小demo,写两个(小而简单的)wrappers的时间,跟做评估差不多。
    • 这意味着我们只能使用 JNI 在 java 应用程序中使用 dll。没有其他选择吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-12
    相关资源
    最近更新 更多