I';我无法使用JNA访问Java代码中的Visual Basic DLL方法

I';我无法使用JNA访问Java代码中的Visual Basic DLL方法,java,dll,java-native-interface,udp,jna,Java,Dll,Java Native Interface,Udp,Jna,我被迫使用JNA(Java本机访问),以便通过eInternet(基于UDP协议)读取数据。我收到了用visual basic编程的插件UDP_RT.dll。现在,我正试图通过JNA帮助在Java代码中使用这个库。我读了很多教程,其中有些很成功,但有些代码不起作用,现在不知道下一步该怎么做。我能够加载库,但无法解决如何使用UDP_RT.dll中的方法的难题,因为我遇到了一个错误: Exception in thread "main" java.lang.UnsatisfiedLinkError:

我被迫使用JNA(Java本机访问),以便通过eInternet(基于UDP协议)读取数据。我收到了用visual basic编程的插件UDP_RT.dll。现在,我正试图通过JNA帮助在Java代码中使用这个库。我读了很多教程,其中有些很成功,但有些代码不起作用,现在不知道下一步该怎么做。我能够加载库,但无法解决如何使用UDP_RT.dll中的方法的难题,因为我遇到了一个错误:

Exception in thread "main" java.lang.UnsatisfiedLinkError: Error looking up function 'close': Nie można odnaleźć określonej procedury.
enter code here
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)

在JNI中,类型被包装到适配器中以与java兼容。这些方法也必须命名为java兼容。尝试构建您自己的dll来包装/展开并间接加载dll

寻找javah来创建与JNI兼容的头文件


这里有一个例子:

在JNI中,类型被包装到适配器中以与java兼容。这些方法也必须命名为java兼容。尝试构建您自己的dll来包装/展开并间接加载dll

寻找javah来创建与JNI兼容的头文件


这里有一个示例:

Visual Studio对象浏览器向您显示程序集的.NET元数据。NET程序集在其函数导出表中通常不具有相同的函数。可以使用或查看导出表。如果你看不到它们,这意味着它们无法通过你正在尝试的技术调用

您可以使用C++/CLI包装器为.NET程序集编写JNI接口。C++/CLI是为了混合C++和.NET而设计的。包装器函数可以导出为JNI实现,它们的代码可以调用.NET方法。如果您要调用的方法是静态的,或者您创建的.NET对象仅在包装器函数调用期间有效,这并不太困难


您还应该考虑使用.NET的互操作库(例如JavaNet、JNBridge),或者如果COM的对象通过COM公开了COM的互操作库(例如JNWRAPPER)。请参见。

Visual Studio对象浏览器将向您显示程序集的.NET元数据。NET程序集在其函数导出表中通常不具有相同的函数。可以使用或查看导出表。如果你看不到它们,这意味着它们无法通过你正在尝试的技术调用

您可以使用C++/CLI包装器为.NET程序集编写JNI接口。C++/CLI是为了混合C++和.NET而设计的。包装器函数可以导出为JNI实现,它们的代码可以调用.NET方法。如果您要调用的方法是静态的,或者您创建的.NET对象仅在包装器函数调用期间有效,这并不太困难


您还应该考虑使用.NET的互操作库(例如JavaNet、JNBridge),或者如果COM的对象通过COM公开了COM的互操作库(例如JNWRAPPER)。请参阅。

有一个名为的包,它非常方便且易于使用! 通过链接,您可以访问docu

有了这个软件包,你可以通过JNA将C#、VB.NET或F#方法导出到Java(其他什么都没有)。我在下面的帖子中提供了更多的细节:-这似乎与我有关/类似


这对我自己的项目帮助很大。我从来没有用VB.NET尝试过,只是用C#,但正如Robert Giesecke在他的文档中所说的,它应该可以同时使用这两种语言。希望这有帮助。干杯

有一个名为的软件包,非常方便易用! 通过链接,您可以访问docu

有了这个软件包,你可以通过JNA将C#、VB.NET或F#方法导出到Java(其他什么都没有)。我在下面的帖子中提供了更多的细节:-这似乎与我有关/类似

这对我自己的项目帮助很大。我从来没有用VB.NET尝试过,只是用C#,但正如Robert Giesecke在他的文档中所说的,它应该可以同时使用这两种语言。希望这有帮助。cheers

将准确显示哪些函数作为原始标签导出。如果导出的函数具有
@NN
后缀,则可能还需要扩展
StdCallLibrary
并使用传入到
Native.loadLibrary
。将准确显示哪些函数作为原始标签导出。如果导出的函数具有
@NN
后缀,则可能还需要扩展
StdCallLibrary
并使用传入到
Native.loadLibrary
  interface UDP_RT extends Library {

    public boolean   Init(int a,int b ,int c,int d);
    void close();

    }


public class Native2{

    public static void main(String[] args) {
        UDP_RT UDP = (UDP_RT)Native.loadLibrary("UDP_RT2", UDP_RT.class,W32APIOptions.ASCII_OPTIONS);
        UDP.close();
        UDP.Init(9000, 8000, 1, 2);

    }
}