在java中通过JNA访问.net dll

时间:2014-03-21 13:14:51

标签: c# java dll java-native-interface jna

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

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

MyConfiguration界面

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反编译工具检查了dll,并且它有被调用的函数,有人可以帮帮忙。

1 个答案:

答案 0 :(得分:2)

  

dll使用dll反编译工具

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

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

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

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