如何在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"));