JNA - UnsatisfiedLinkError:找不到指定的模块。 (在Cgwin,Win32上)

时间:2015-08-03 00:25:18

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

此问题类似于Q1Q2

我的Java代码,使用JNA加载本机库,如下所示:

69.    Print.good("found file: " + libraryPath);
70.    if( System.getProperty("os.name").toLowerCase().contains("win") ) {
71.        final String search_path = FileFinder.getParentDirPath(libraryPath);
72.        NativeLibrary.addSearchPath("libReliableServerNative", 
73.               search_path );
74.        Print.good("Added search path: " + search_path);
75.        System.setProperty("java.library.path", search_path);
76.        nativeLib = (NativeLib) Native.loadLibrary("libReliableServerNative", CTest.class);
        } 

我的终端输出,打印行号和库文件位置,如下所示:

++  Thread "main": Core_Reliable.Stupid_Client_UDP_Reliable.<clinit>(Stupid_Client_UDP_Reliable.java:69)
++  found file: C:\Users\HOLLYWOOD\Documents\NetBeansProjects\ReliableServerMadeUnreliable2\build\classes\libReliableServerNative.dll

++  Thread "main": Core_Reliable.Stupid_Client_UDP_Reliable.<clinit>(Stupid_Client_UDP_Reliable.java:74)
++  Added search path: C:\Users\HOLLYWOOD\Documents\NetBeansProjects\ReliableServerMadeUnreliable2\build\classes

java.lang.UnsatisfiedLinkError: The specified module could not be found.

    at com.sun.jna.Native.open(Native Method)
    at com.sun.jna.Native.open(Native.java:1759)
    at com.sun.jna.NativeLibrary.loadLibrary(NativeLibrary.java:260)
    at com.sun.jna.NativeLibrary.getInstance(NativeLibrary.java:398)
    at com.sun.jna.Library$Handler.<init>(Library.java:147)
    at com.sun.jna.Native.loadLibrary(Native.java:412)
    at com.sun.jna.Native.loadLibrary(Native.java:391)
    at Core_Reliable.Stupid_Client_UDP_Reliable.<clinit>(Stupid_Client_UDP_Reliable.java:76)
Exception in thread "main" Java Result: 1

^您在我的Java代码的第76行看到,Native.loadLibrary抛出UnsatisfiedLinkError。 ^

  1. 我排除了混合32位和64位库的可能性,因为我使用32位Java在32位Windows机器上编译了本机库和Java代码,并指定了“-m32” gcc的命令行参数,应该输出一个32位的dll。对于本机编译,我使用了cygwin。

  2. 我也排除了找不到库的可能性,因为在那种情况下我得到了“ java.lang.UnsatisfiedLinkError:无法加载库”而不是上面的“ java.lang.UnsatisfiedLinkError:找不到指定的模块。

  3. 我认为发生的事情是“它无法加载...... dll缺少某些依赖项。”但是本机库(libReliableServerNative.dll)只不过是一个没有C标准库以外的依赖项的单个C文件。

    libReliableServerNative的完全依赖:

    #include<stdio.h> //printf
    #include<string.h> //memset
    #include<stdlib.h> //exit(0);
    #include<arpa/inet.h> // inet_aton
    #include<sys/socket.h> // unix socket
    #include <unistd.h>
    #include <netinet/in.h>
    

    你知道为什么会这样吗?

    *更新* 当我将cygwin1.dll放入jna路径时,不满意的链接错误就消失了。

    我现在的问题是我没有收到任何错误消息。永远不会调用本机方法 - 不会出现本机代码中的printf语句,但程序不会终止或抛出任何异常。调用nativeLib.myFunction()之后的java语句不会被执行。

1 个答案:

答案 0 :(得分:0)

我得到了它的工作。如果使用cygwin进行编译,则必须将cygwin1.dll放在资源路径中。