【问题标题】:java.lang.UnsatisfiedLinkError: Unable to load libraryjava.lang.UnsatisfiedLinkError:无法加载库
【发布时间】:2015-10-07 09:03:58
【问题描述】:
DLL INSTANCE = (DLL) Native.loadLibrary(Settings.getSingletonInstance().getProperty("default.ergoPointer.path"), DLL.class);

我将 dll 路径存储在设置文件中。当我输出

Settings.getSingletonInstance().getProperty("default.ergoPointer.path"

这里:C:\Users\Argenit\Desktop\aaa\dll\ErgoPointer_64_Bit.dll

错误部分:

java.lang.UnsatisfiedLinkError: 无法加载库 'C:\Users\Argenit\Desktop\aaa\dll\ErgoPointer_64_Bit.dll':本机 图书馆 (win32-x86-64/C:\Users\Argenit\Desktop\aaa\dll\ErgoPointer_64_Bit.dll) 在资源路径中找不到 ([文件:/C:/Users/Argenit/Desktop/Pathology_JAVA/Digital_Pathology/bin/, 文件:/C:/Users/Argenit/Desktop/Pathology_JAVA/Digital_Pathology/resources/, 文件:/C:/Users/Argenit/Desktop/Pathology_JAVA/Digital_Pathology/lib/fits.jar, 文件:/C:/Users/Argenit/Desktop/Pathology_JAVA/Digital_Pathology/lib/json.jar, 文件:/C:/Users/Argenit/Desktop/Pathology_JAVA/Digital_Pathology/lib/junit-4.8.2.jar, 文件:/C:/Users/Argenit/Desktop/Pathology_JAVA/Digital_Pathology/lib/kdu_jni.jar, 文件:/C:/Users/Argenit/Desktop/Pathology_JAVA/Digital_Pathology/lib/log4j-1.2.16.jar, 文件:/C:/Users/Argenit/Desktop/Pathology_JAVA/Digital_Pathology/JNA/jna-4.1.0.jar, 文件:/C:/Users/Argenit/Desktop/Pathology_JAVA/Digital_Pathology/JNA/jna-platform-4.1.0.jar, 文件:/C:/Users/Argenit/Desktop/Pathology_JAVA/Digital_Pathology/lib/ini4j-0.5.4.jar, 文件:/C:/Users/Argenit/Desktop/Pathology_JAVA/Digital_Pathology/JNA/, 文件:/C:/Users/Argenit/Desktop/Pathology_JAVA/Digital_Pathology/lib/gluegen-rt.jar, 文件:/C:/Users/Argenit/Desktop/Pathology_JAVA/Digital_Pathology/lib/jogl.jar])

如果我在项目中添加 (dll) 作为外部类文件夹并写入:loadLibrary("ErgoPointer_64_Bit"),它可以在这台机器上运行,但是当我使用可运行的 jar 时,它找不到 ErgoPointer_64_Bit 所以我想给出绝对dll的路径。但这对我不起作用。

我也试过了:

C:\Users\Argenit\Desktop\aaa\dll\ErgoPointer_64_Bit

dll\ErgoPointer_64_Bit

ErgoPointer_64_Bit

dll\ErgoPointer_64_Bit.dll

ErgoPointer_64_Bit.dll

【问题讨论】:

    标签: java dll jar


    【解决方案1】:

    在调用 Native.loadLibrary() 之前设置系统属性 java.library.path,只使用基本名称。

    System.setProperty("java.library.path", 
                "C:\\Users\\Argenit\\Desktop\\aaa\\dll;" 
                  + System.getProperty("java.library.path"));
    DLL INSTANCE = (DLL) Native.loadLibrary("ErgoPointer_64_Bit", DLL.class);
    

    您还可以在命令行上设置 java.library.path。例如。

    java "-Djava.library.path=C:\Users\Argenit\Desktop\aaa\dll\" -jar somejar.jar
    

    【讨论】:

    • 我如何知道不同计算机中的计算机名称(Argenit)?
    • 您可以使用InetAddress.getLocalHost().getHostName() 获取计算机名称,但实际上 Argenit 看起来像用户名而不是主机名。您可以使用System.getProperty("user.home") 获取用户的主目录,或者使用System.getProperty("user.name") 获取用户名。
    • 非常感谢,我发现了错误。操作系统是 64 位的,但 java 是 32 位的。我导出 64 位 dll,所以它为什么不起作用
    猜你喜欢
    • 2013-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多