0

我知道三个是关于这个的一些问题,但我还没有找到确切的答案。我们有一个没有依赖项或 p/Invoke 的 .Net dll (C#)。所以它是一个完整的.net 平台库。我们的一位客户想要在 Java 应用程序中使用它。

最好的选择是什么?我一直在研究 jni4net 这可能是一个完美的解决方案,但它似乎不支持 .Net 中的泛型(我们的 dll 使用很多泛型字典和集合)

是JNA最好的选择吗?

提前致谢

4

2 回答 2

4

几年前我也遇到过类似的问题。我有一个用 Delphi 编写的 dll。(Delphi 是 Borland 销售的基于 Pascal 的 Windows 应用程序开发工具。)我需要从 Java 中调用 dll,但某些 dll 函数的参数和返回类型与 Java 不兼容。(作为一个有趣的,如果无关紧要,除此之外,为 Microsoft 发明 C# 的 Anders Hejlsberg 也为 Borland 发明了 Delphi。)这就是我解决问题的方法。

1) 我确实使用 jni 来允许我的 Java 代码调用 dll。

2) 我在 Delphi 中编写了一个瘦包装 dll,它是我的 Java jni 代码调用的实际 dll。对于那些与 Java 完全兼容的函数,包装器 dll 只是作为一个传递,直接调用实际的 dll 函数并返回返回值。对于那些不兼容的函数,包装器 dll 定义了与 Java 兼容的相应方法,并在调用实际的 dll 之前从 Java 到 Delphi 进行了适当的翻译。

3)我还在我的 jni 调用之上写了一个瘦包装对象。同样,在大多数情况下,java 包装器直接对那些在 Java 和 Delphi 之间完全兼容的函数进行 jni 调用。然而,在我的例子中,一些函数需要我传入 Delphi 对象。所以,我所做的是定义相应的 Java 对象。我的 Java 包装器对象的主要目的是获取这些 Java 对象,将它们转换为与我的 Delphi 包装器 dll 兼容的参数,然后进行适当的 jni 调用。此外,对于那些传回对象的 dll 函数,我的 java 包装器从 jni 调用中获取与 java 兼容的返回值,并创建和组装适当的对象。

这听起来像是很多工作,但实际上并非如此(我的 dll 有超过 100 种方法,以及十几种 Delphi 对象类型)。完成后,编写实际使用 dll 的 Java 应用程序代码非常简单。

关于泛型,这可能是一个问题。但是,如果在现实生活中,您支持的对象类型的数量相对较少(而且经常如此),您可以在包装器中为每个对象类型编写单独的调用。(这就是我们这些记得 Java 2 在他们发明泛型之前曾经做过的事情,它工作得很好,即使它有点不那么优雅。)你的应用程序 Java 代码仍然可以使用泛型。包装器将根据传入的实际类型进行适当的调用。

希望这会给你一些关于如何进行的想法。

于 2012-06-15T23:57:25.743 回答
1

要在 JAVA 中使用 .NET DLL,我想说最好的选择是使用 Javonet 之类的本机桥接器。有了这样的桥,您只需将 .NET dll 复制到您的 JAVA 项目文件夹并通过一个方法调用加载它,然后像使用 JAVA 对象一样使用 .NET 对象。您跳过整个原生部分,并获得许多用于数据类型转换、订阅事件、垃圾收集器、异常和许多其他的内置工具。

使用“Your.dll”的示例代码可能如下所示:

Javonet.addReference("Your.dll");
NObject yourDotNetObject = Javonet.New("MyDotNetClass");
yourDotNetObject.invoke("FooMethod", arg1, arg2);

//out of the box you get also support for all types, arrays, generics etc
yourDotNetObject.generic(Javonet.getType("String")).invoke("Foo", "sample");
//such code could call following .NET method passing String as T
//void Foo<T>(T arg);

因此,正如您看到的半反射语法,您可以访问整个 .NET 世界,包括任何自定义 DLL 或 .NET 框架类。手动解决方案很好,但更适合学习然后在实际项目中使用,因为解决所有问题可能需要更多时间,然后是您的整个项目需要;)

有关更多示例,请查看: http ://www.javanet.com/quick-start-guide/

于 2013-11-07T21:59:00.543 回答