如何在Java中使用.Net dll

3

我有一个在vb.net中创建的dll文件。 如何在JAVA中使用它的函数。

我在谷歌上搜索时发现了JNI,但是无法理解。 请问是否有带示例的简单文档。


说实话,我会根据dll所做的复杂程度来决定是否值得在Java中复制功能,如果代码不是太多的话。让dll与Java一起工作可能会更加麻烦。 - David
3个回答

6

我建议使用 Java Native Access (JNA),因为它比使用 JNI 更容易。假设您有一个包含一些函数的 DLL 文件,

  • 创建一个 Java 接口,其方法签名与 DLL 中的函数相同。

例如:

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之间数据类型的映射,请参考上面的链接。

这里是另一个示例


谢谢Santosh,我会尝试你的解决方案。它似乎比JNI更简单。 - Sudz
它给我编译时错误,找不到符号Native。 我需要导入哪个类? - Sudz
需要导入的包是com.sun.jna.Native。请参考答案中的维基百科链接。 - Santosh
1
我尝试了,但是出现了以下错误: “Exception in thread "main" java.lang.UnsatisfiedLinkError: Error looking up function 'GetStatus': The specified procedure could not be found." GetStatus 是我的 DLL 中的一个函数。 - Sudz

2

如果没有大量的工作,JNI将不会直接让你访问.NET。你可以构建自己的包装器并使用C/C++作为中间件,但对于小型项目来说,这将永远得不偿失。记住,调用方法只是一方面,正确类型地传递参数,检索结果,订阅事件等等都是更加重要的事情。

因此,我建议您查找第三方工具,这些工具已经很好地准备了这些场景。

首先至少检查这两个:

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

JNBridge的工作方式非常相似,但是它有更多用于流行企业场景(如云集成或WebSphere)的附加组件/扩展,但这一点更适合于需要在单独的计算机上桥接Java和.NET的较大项目。它更强大,但也更复杂和重量级。

两者都可以免费试用,而Javonet可以免费用于非商业和学术使用,因此请尝试、测试并选择最符合您要求的工具。


0

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

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


那些第三方工具是哪些? - Sudz
很遗憾,我们本来打算评估几款产品,但最终决定使用JNI自己实现。这只是为了一个小型演示,编写两个(小而简单的)包装器所需的时间与进行评估的时间相同。 - Rajesh
这意味着我们只能使用JNI在Java应用程序中使用dll,没有其他可用的选项吗? - Sudz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接