如何在Java中使用JNA lib使用C#函数

我花了很多时间尝试在我的Java应用程序中使用C#函数但没有成功……我在C#中编写了以下lib:

public class Converter { public Converter() { } public bool ConvertHtmlToPdf(String directoryPath) { //DO SOMETHING } } 

这个dll调用另一个dll进行一些操作,但是当我编译它时,我可以在我的Realse文件夹中找到Dlls,一切似乎都没问题,所以我使用32位选项,64位和任何CPU选项编译它只是为了确保它不是我的问题。

使用Dependency Walker在32位和任何CPU选项中分析我的dll文件,它说IESHIMS.DLL无法找到,并显示以下消息:

警告:找不到至少一个延迟加载依赖项模块。 警告:由于延迟加载相关模块中缺少导出function,至少有一个模块具有未解析的导入。

64位文件没有出现,但我找不到我的ConvertHtmlToPdf函数。

由于我不知道它是否相关,我的第二步是在Java代码中。

要加载我的库我做:

 System.setProperty("jna.library.path", "C:\\Program Files (x86)\\Facilit\\Target App\\lib"); 

和:

 public interface IConversorLibrary extends Library { IConversorLibrary INSTANCE = (IConversorLibrary) Native.loadLibrary("converter", IConversorLibrary.class); void ConvertHtmlToPdf(String directoryPath); } 

(lib似乎加载成功,因为如果我尝试删除运行它的应用程序的dll文件,说它无法删除,因为它正在使用),最后:

 IConversorLibrary.INSTANCE.ConvertHtmlToPdf(directoryPath); 

但结果并非如我所愿:

 java.lang.UnsatisfiedLinkError: Error looking up function 'ConvertHtmlToPdf': Could not find the specified procedure. 

我不知道我做错了什么,我尝试了许多教程和很多东西,但似乎任何工作,任何帮助都非常感激。

正如technomage所说:

JNA可以从使用C链接的DLL加载。 AC#类默认不支持任何类型的C链接。 C ++支持使用extern“C”表示法的C链接。

本文展示了一种使C#DLLs方法可以像C风格的DLL一样调用的方法,遗憾的是它非常复杂。

这款Nugget非常易于使用,效果很好。 https://www.nuget.org/packages/UnmanagedExports

您需要Visual Studio 2012(快速)。 安装后,只需在要导出的任何静态函数之前添加[RGiesecke.DllExport.DllExport] 。 而已!

例:

C#

 [RGiesecke.DllExport.DllExport] public static int YourFunction(string data) { /*Your code here*/ return 1; } 

Java的

在顶部添加导入:

  import com.sun.jna.Native; 

在您的class级中添加界面。 它的C#函数名称前面带有字母“I”:

  public interface IYourFunction extends com.sun.jna.Library { public int YourFunction(String tStr); }; 

在课堂上调用您需要的DLL:

 IYourFunction iYourFunction = (IYourFunction )Native.loadLibrary("full or relative path to DLL withouth the .dll extention", IYourFunction.class);//call JNA System.out.println("Returned: " + IYourFunction.YourFunction("some parameter"));