当前位置: 首页 > 知识库问答 >
问题:

JNA - 不满意的链接错误: 找不到指定的模块。(在格温,Win32上)

琴正初
2023-03-14

这个问题有点像Q1和Q2。

我的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。^

>

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

    我还排除了找不到库的可能性,因为在这种情况下,我得到了“java.lang.UnsatisfiedLinkError:Unable to load library”,而不是上面的“java.lang.UnsatifiedLinkEror:the specified module could not found”

    我认为正在发生的是“它不能被加载...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 语句,但html" target="_blank">程序不会终止或引发任何异常。调用本机Lib.my函数()之后的 java 语句不会被执行。

  • 共有1个答案

    郭坚壁
    2023-03-14

    我成功了。如果使用cygwin进行编译,则必须将cygwin1.dll放在资源路径中。

     类似资料:
    • 我刚从下载了Tess4Jhttp://tess4j.sourceforge.net/并将其导入到netbeans中。我遵循这个url,我正确地遵循了每一步,但当我尝试执行时,我得到了下面的错误。 错误: 我搜索并发现人们建议更新到 Visual Visual Studio 2013 的可再发行组件包,我做了,但事实证明没有帮助,我仍然遇到同样的问题。我不知道我做错了什么,下面是我的代码。 代码:

    • 问题内容: 我想创建一个简单的JNI层。我使用Visual Studio 2008创建了一个dll(带有DLL作为选项的Win 32 Console Application项目类型)。我在调用本地方法时收到此异常: 生成的头文件是: 实现文件是: Java文件是: 当我调用本地方法“ Hello”时,我得到执行。 我观察到的另一件事是,当我使用以下命令在命令行中进行编译时:“ cl -I” C:\

    • 问题内容: 我尝试从MySQL工作台连接到最新的MySQL服务器8.0.11,但错误不断弹出:无法连接到MySQL服务器,身份验证插件:caching_sha2_password:找不到指定的模块。 我尝试在线观看MySQL服务器安装视频,并准确地复制了每个步骤,但是错误仍然存​​在。 任何帮助是极大的赞赏。 问题答案: 我有以下解决方案:在这样的部分中更改 my.ini: 在命令行客户端的roo

    • 我在stackoverflow上四处寻找类似的问题,但我找到的解决方案似乎都不适合我。我在一台Linux /Ubuntu机器上。我只是在练习JNI,但我发现了这个错误: 我提供了我的 .c、.h 和 .java文件。 .java文件: .c文件: .h 文件: 我使用这些命令生成. h文件,编译/生成. so文件,然后运行: JAVACnativetest.java javah-jni nativ

    • 这些是我的系统规格 > Windows 64bit Java 11 64位

    • 我正在使用Rcpp和另一个第三方C库开发一个包。当我试图安装包时,我得到了 在32位Windows操作系统中,根据我同事的建议,我通过将以下DLL的位置从MingW添加到系统路径,解决了这个问题。 但64位Windows,我得到相同的错误,即使与dll虽然我使用32位R。 所以我的问题是: 有没有办法知道为什么错误发生?我是说我想知道哪个模块不见了。也许冗长的选项在哪里?