【问题标题】:Java native library System.loadLibrary fails with UnsatisfiedLinkErrorJava 本机库 System.loadLibrary 失败并出现 UnsatisfiedLinkError
【发布时间】:2011-03-22 09:11:32
【问题描述】:

我正在尝试在 Java 中使用本机 C++ 库。

当我用

加载它时
System.loadLibrary(filename);

我得到错误:

java.lang.UnsatisfiedLinkError: 不应出现目录分隔符 在库名中:C:\HelloWorld.dll

有什么办法可以解决这个问题吗?

【问题讨论】:

标签: java c++ native


【解决方案1】:

只需使用:

System.loadLibrary("HelloWorld"); // without c:\ and without ".dll" extension

另外,请确保 HelloWorld.dll 在您的库路径中可用。

【讨论】:

  • 好的,我在不使用 C: 的情况下尝试它,但出现错误:java.lang.UnsatisfiedLinkError:java.library.path 中没有 HelloWorld.dll。如何设置本机路径?我在属性 -> Java 构建路径 -> 库中尝试过,但它不起作用
【解决方案2】:

loadLibrary 需要不带路径和扩展名的文件名。

如果你想使用完整路径,你可以试试 System.load() 方法。

java.lang.System API

【讨论】:

    【解决方案3】:

    我使用 JNA 来做到这一点...

    JNA 是一种调用 Native 函数的简单方法,它提供了对完成此任务有用的 NativeLibrary 类:

    //调用原生函数的Java代码

    dll = NativeLibrary.getInstance(Mydll);
    
    Function proxy;
    
    proxy = dll.getFunction(Utils.getMethods().get("MyMethodEntryPoint"));
            byte result[] = new byte[256];
            int maxLen = 250;
            String strVer = "";
            Object[] par = new Object[]{result, maxLen};
            intRet = (Integer) proxy.invoke(Integer.class, par);
            if (intRet == 0) {
                strVer = Utils.byteToString(result);
            }
    

    你可以在http://jna.java.net/找到文档

    【讨论】:

      【解决方案4】:

      令人惊讶的是,也可以使用以下内容:

          final File dll = new File("src/lib/Tester32.dll");
      
          Test32 test32 = (Test32) Native.loadLibrary(dll.getAbsolutePath(), Test32.class);
      
          System.out.println(test32.toString() + " - " + test32.GetLastError());
      

      它输出:

      Proxy interface to Native Library <C:\workspace\jna\src\lib\Tester32.dll@387842048> - 0
      

      Javadoc 说:

      加载库

      公共静态对象 loadLibrary(字符串名称, 类接口Class)

      将库接口映射到给定的 共享库,提供显式 接口类。如果名称为空, 尝试映射到当前 过程。

      如果我将.\src\lib 文件夹中的Tester32.dll 重命名为其他名称,则会出现以下异常:

      线程“main”中的异常 java.lang.UnsatisfiedLinkError:无法 加载库 'C:\workspace\jna\src\lib\Tester32.dll': 指定的模块不能是 找到了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-02-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-16
        • 2016-04-30
        • 1970-01-01
        相关资源
        最近更新 更多