簡體   English   中英

Linux上的java.lang.UnsatisfiedLinkError

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM