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