Linux上的java.lang.UnsatisfiedLinkError

时间:2014-06-03 19:33:52

标签: java linux unsatisfiedlinkerror

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

/test/lib/liblzo.so

然后我有以下Java代码:

import 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长度限制?

2 个答案:

答案 0 :(得分:0)

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

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

要解决此问题,我建议您将java.library.path设置为绝对路径,这些事情无关紧要。

答案 1 :(得分:0)

为什么不将liblzo.so放在某个包中并将其作为资源获取? 类似的东西:

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

然后你不必再担心路径了