[英]java.lang.UnsatisfiedLinkError on Linux
我有一個基於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
長度約束嗎?
您使用的是相對庫路徑,我懷疑您會發現測試框架正在從其他目錄執行文件。 通過檢查當前工作目錄來確認這一點:
System.out.println("user.dir=" + System.getProperty("user.dir"));
要解決此問題,建議您將java.library.path
設置為絕對路徑,這樣這些事情就無關緊要了。
為什么不將liblzo.so放在某個包中並作為資源獲取呢? 就像是:
getClass().getClassLoader().getResource("package.liblzo.so");
然后,您不必再擔心路徑
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.