【问题标题】:java.lang.UnsatisfiedLinkError on LinuxLinux 上的 java.lang.UnsatisfiedLinkError
【发布时间】:2014-06-03 19:33:51
【问题描述】:

我有一个在 Linux 上构建的库,可以在这里找到:

/test/lib/liblzo.so

然后我有以下 Java 代码:

导入 org.junit.Test;

public class CompressionTest {

    @Test
    public void testCompression() throws Exception {
        System.out.println("java.library.path=" + System.getProperty("java.library.path"));
        try {
            System.loadLibrary("lzo");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

运行它会产生以下异常:

CompressionTest > testCompression FAILED
        java.lang.UnsatisfiedLinkError: no lzo in java.library.path
            at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1878)
            at java.lang.Runtime.loadLibrary0(Runtime.java:849)
            at java.lang.System.loadLibrary(System.java:1087)
            at CompressionTest.testCompression(CompressionTest.java:11)

但我可以从测试的标准中看到我的库的路径在库路径上:

java.library.path=/test/lib

我已将代码剥离回最简单的设置,但我仍然无法理解为什么没有加载库。谁能告诉我可能出了什么问题以及我可以如何更多地调试问题?

更新

我昨天玩了很多次,如前所述,我为这篇文章清理了完整的 java.library.path,但我注意到它相当长。总长度很长,而且它上面的每个目录都是相当嵌套的(可能是 8/9 层)。我将路径缩减为仅包含我知道 so 库所在的目录并且它有效。

有人知道java.library.path 的长度限制吗?

【问题讨论】:

  • 请看我在帖子中的第一条评论,它已经被称为。

标签: java linux unsatisfiedlinkerror


【解决方案1】:

您使用的是相对库路径,我怀疑您会发现您的测试框架正在从不同的目录执行您的文件。通过检查您当前的工作目录来确认这一点:

System.out.println("user.dir=" + System.getProperty("user.dir")); 

要修复它,我建议您将 java.library.path 设置为绝对路径,这样这些事情就无关紧要了。

【讨论】:

  • 抱歉,为了这篇文章,我需要更改路径。我已经更新了我的原始帖子,我的库路径上的路径都是绝对的。
  • @imrichardcole 你能制作一个没有敏感信息的测试用例,以便发布你收到的实际消息吗?说它输出“java.library.path=/test/lib”并不会使调试变得更困难。
【解决方案2】:

为什么不将 liblzo.so 放在某个包中并将其作为资源获取呢? 比如:

getClass().getClassLoader().getResource("package.liblzo.so");

那你就不用再担心路径了

【讨论】:

    猜你喜欢
    • 2010-10-07
    • 1970-01-01
    • 1970-01-01
    • 2015-11-10
    • 2011-03-18
    相关资源
    最近更新 更多