簡體   English   中英

Linux 和 Java:java 庫路徑中沒有本機,但它在那里

[英]Linux & Java: no native in java library path whereas it is there

我在我的 Java 代碼中使用 JNI 與 C++ 進行通信。C++ 代碼被編譯並存儲在本地庫中,Java 可以訪問該庫。在 Windows 上,我使用 IntelliJ 運行我的代碼並將包含本地庫的文件夾添加到我的-Djava.library.path。 這里沒有問題,我的代碼運行得很好並且能夠找到並使用該庫。

我的下一步是讓它全部在 Linux 的服務器上運行。在這里,我遇到了問題。 使用 GitHub,我將我的代碼拉到服務器上,創建 my.cpp 文件的新對象並將其編譯成 native.so 庫。 接下來,我將我的實驗稱為

java -Djava.library.path=/home/usr/ILOG/CPLEX_Studio1210/cplex/bin/x86-64_linux:/home/usr/FSVRPpd/lib -cp ./target/FSVRPpd-1.0.jar -Xmx15g fvrpsd.test.FSVRPpdTest

庫路徑包括對兩個文件夾的引用,一個用於 CPLEX,另一個指向包含本機庫的文件夾。

在我的 Java 代碼中,我有:

 static {System.out.println(System.getProperty("java.library.path")); System.loadLibrary("native");}

打印 java 庫路徑(作為檢查)並加載庫。 運行我的代碼返回以下 output:

/home/usr/ILOG/CPLEX_Studio1210/cplex/bin/x86-64_linux:/home/usr/FSVRPpd/lib
Exception in thread "main" java.lang.UnsatisfiedLinkError: no native in java.library.path: 
[/home/usr/ILOG/CPLEX_Studio1210/cplex/bin/x86-64_linux, /home/usr/FSVRPpd/lib]
    at java.base/java.lang.ClassLoader.loadLibrary(ClassLoader.java:2660)
    at java.base/java.lang.Runtime.loadLibrary0(Runtime.java:829)
    at java.base/java.lang.System.loadLibrary(System.java:1867)
    at fvrpsd.test.FSVRPpdTest.<clinit>(FSVRPpdTest.java:136)

它顯示位置已正確包含,但無法找到本機庫,即使它位於第二個文件夾中。

我在這個網站上閱讀了很多關於此的帖子,並嘗試將 java 庫路徑添加到LD_LIBRARY_PATH ,但沒有成功。

我期待着任何關於我可以做些什么來識別問題的建議。

您的本機庫必須在 Linux 上稱為libnative.so ,在native.dll上必須稱為 native.dll。

System.loadLibrary文檔

加載由 libname 參數指定的本機庫。
libname 參數不得包含任何特定於平台的前綴、文件擴展名或路徑。

這有助於編寫跨平台代碼,因為每個平台的模式都不同。 您可以使用System.mapLibraryName自己計算預期的文件名,例如:

# Linux
jshell> System.mapLibraryName("native")
$1 ==> "libnative.so"

# macOS
jshell> System.mapLibraryName("native")
$1 ==> "libnative.dylib"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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