我有一个在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
长度限制?
答案 0 :(得分:0)
您正在使用相对库路径,我怀疑您会发现您的测试框架正在从其他目录执行您的文件。通过检查当前的工作目录来确认:
System.out.println("user.dir=" + System.getProperty("user.dir"));
要解决此问题,我建议您将java.library.path
设置为绝对路径,这些事情无关紧要。
答案 1 :(得分:0)
为什么不将liblzo.so放在某个包中并将其作为资源获取? 类似的东西:
getClass().getClassLoader().getResource("package.liblzo.so");
然后你不必再担心路径了