在java中通过JNA访问.net dll

本文关键字:访问 net dll JNA java | 更新日期: 2023-09-27 17:51:16

我有一个。net 4.0 dll,它有一个命名空间,在这个命名空间中有一个类,我想使用jna访问这个类中的过程。

我已经包含了java .jar以及platform.jar(以防万一)使用maven,我的java代码看起来像这样

<<p> MyConfiguration接口/strong>
import com.sun.jna.Library;
public interface MyConfiguration extends Library{
    public void callInterface();
}

访问dll代码

MyConfiguration myAPI = (MyConfiguration) Native
                       .loadLibrary("dll/MyAPI.dll", MyConfiguration.class);
System.out.println("Interface Created");
System.out.println("Calling Interface");
myAPI.callInterface();

但是我得到了异常->

Exception in thread "main" java.lang.UnsatisfiedLinkError: Error looking up function 'myInterface': The specified procedure could not be found.
    at com.sun.jna.Function.<init>(Function.java:208)
    at com.sun.jna.NativeLibrary.getFunction(NativeLibrary.java:536)
    at com.sun.jna.NativeLibrary.getFunction(NativeLibrary.java:513)
    at com.sun.jna.NativeLibrary.getFunction(NativeLibrary.java:499)
    at com.sun.jna.Library$Handler.invoke(Library.java:199)
    at com.sun.proxy.$Proxy0.myInterface(Unknown Source)
    at foo.App.main(App.java:83)

我已经用dll反编译工具检查过了,里面有调用函数,有没有人能帮我一下

在java中通过JNA访问.net dll

dll使用dll反编译工具

您需要使用PE(可移植可执行文件)查看器来查找导出表中的条目。(取决于是一个)

大多数。net dll不以这种方式导出函数。当它们这样做时,是通过一种称为Reverse P/Invoke的机制,大多数Microsoft . net语言编译器都不支持这种机制。c++/CLI语言就是为此目的而设计的。

你可能会发现Java-的成功之路更短。。NET桥接产品。或者,如果. net DLL将类公开为COM对象,则使用Java-COM桥接产品。(使用OLE/COM对象查看器检查COM DLL)

另外,请确保DLL具有与JVM进程相同的位(例如java.exe或java.exe),除非您将其用作进程外COM对象。