如何在 2019 年从 Java link 到 "unix-java"
How to link to "unix-java" from Java in 2019
我正在使用 here 中的 NetworkManager / DBus 代码。它构建成功但在运行时产生:
Exception in thread "main" java.lang.UnsatisfiedLinkError: no unix-java in java.library.path: [/usr/java/packages/lib, /usr/lib64, /lib64, /lib, /usr/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:1870)
at cx.ath.matthew.unix.UnixSocket.<clinit>(UnixSocket.java:40)
at org.freedesktop.dbus.Transport.connect(Transport.java:772)
at org.freedesktop.dbus.Transport.<init>(Transport.java:737)
at org.freedesktop.dbus.DBusConnection.<init>(DBusConnection.java:299)
at org.freedesktop.dbus.DBusConnection.getConnection(DBusConnection.java:282)
这是一个 Maven 项目。我可以通过引入另一个工件或声明来解决这个问题吗?如果我使用的是过时的代码,我整天都在兜圈子,看看有 10 多年历史的东西,因为以前我一直在使用自己的 类 通过自省生成的代码,但现在显然我需要这个额外的库。
或者这个 unix-java 库是我必须通过发行版的包管理器引入的答案吗? emerge
、apt-get
或任何一个。
看起来一些底层代码正在使用 java 本机接口 (JNI) 并且需要加载 unix 共享对象。
这通常是通过在启动 JVM 时将 .so 文件添加到库路径来实现的。
导出 LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path/to/the/directory/containing/so
这也可以通过 -Djava.library.path JVM args 添加库来实现。
发现 this DBus service page 可能不相关,但提到了您正尝试使用的同一本机库:
For dbus support you need jni/unix-java.so installed on your system (Debian: libunixsocket-java ArchLinux: libmatthew-unix-java (AUR)).
它提到 unix-java.so
作为本机库,与您尝试加载的库相同,因此如果您使用 Debian/Ubuntu,请尝试执行以下操作:
apt install libunixsocket-java
感谢大家的建议。我最终做的是使用 this DBus stuff with this NetworkManager 东西。显然我不得不在 kk-dbus-nm-java 中更改很多 import
包名称,但好处是不需要 hypfvieh 的 DBus 东西一个单独的套接字库。
我对具有类似要求的不同 DBus 项目执行了以下操作。该项目具有以下依赖项:
libdbus-java-2.7.jar
(项目已经包含这个jar)
/usr/share/java/unix.jar
(通过安装 debian 软件包并从中添加 jar 感到满意)
/usr/share/java/hexdump.jar
(通过maven满意)
我在 Linux shell.
中执行了以下操作
sudo apt install libunixsocket-java
我是用Eclipse配置的运行这个项目,所以下面的内容适用于Eclipse。
我把项目转成了maven项目。然后我添加了以下maven依赖项。
<!-- https://mvnrepository.com/artifact/org.abstractj.libmatthew/hexdump -->
<dependency>
<groupId>org.abstractj.libmatthew</groupId>
<artifactId>hexdump</artifactId>
<version>0.2.1</version>
</dependency>
然后我将 /usr/share/java/unix.jar
添加到 Java BuildPath->Libraries。
然后在“Java BuildPath->Libraries->unix.jar->Native Library Location”包含 /usr/lib/jni
路径
最后:命中运行。
我正在使用 here 中的 NetworkManager / DBus 代码。它构建成功但在运行时产生:
Exception in thread "main" java.lang.UnsatisfiedLinkError: no unix-java in java.library.path: [/usr/java/packages/lib, /usr/lib64, /lib64, /lib, /usr/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:1870)
at cx.ath.matthew.unix.UnixSocket.<clinit>(UnixSocket.java:40)
at org.freedesktop.dbus.Transport.connect(Transport.java:772)
at org.freedesktop.dbus.Transport.<init>(Transport.java:737)
at org.freedesktop.dbus.DBusConnection.<init>(DBusConnection.java:299)
at org.freedesktop.dbus.DBusConnection.getConnection(DBusConnection.java:282)
这是一个 Maven 项目。我可以通过引入另一个工件或声明来解决这个问题吗?如果我使用的是过时的代码,我整天都在兜圈子,看看有 10 多年历史的东西,因为以前我一直在使用自己的 类 通过自省生成的代码,但现在显然我需要这个额外的库。
或者这个 unix-java 库是我必须通过发行版的包管理器引入的答案吗? emerge
、apt-get
或任何一个。
看起来一些底层代码正在使用 java 本机接口 (JNI) 并且需要加载 unix 共享对象。
这通常是通过在启动 JVM 时将 .so 文件添加到库路径来实现的。
导出 LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path/to/the/directory/containing/so
这也可以通过 -Djava.library.path JVM args 添加库来实现。
发现 this DBus service page 可能不相关,但提到了您正尝试使用的同一本机库:
For dbus support you need jni/unix-java.so installed on your system (Debian: libunixsocket-java ArchLinux: libmatthew-unix-java (AUR)).
它提到 unix-java.so
作为本机库,与您尝试加载的库相同,因此如果您使用 Debian/Ubuntu,请尝试执行以下操作:
apt install libunixsocket-java
感谢大家的建议。我最终做的是使用 this DBus stuff with this NetworkManager 东西。显然我不得不在 kk-dbus-nm-java 中更改很多 import
包名称,但好处是不需要 hypfvieh 的 DBus 东西一个单独的套接字库。
我对具有类似要求的不同 DBus 项目执行了以下操作。该项目具有以下依赖项:
libdbus-java-2.7.jar
(项目已经包含这个jar)/usr/share/java/unix.jar
(通过安装 debian 软件包并从中添加 jar 感到满意)/usr/share/java/hexdump.jar
(通过maven满意)
我在 Linux shell.
中执行了以下操作sudo apt install libunixsocket-java
我是用Eclipse配置的运行这个项目,所以下面的内容适用于Eclipse。
我把项目转成了maven项目。然后我添加了以下maven依赖项。
<!-- https://mvnrepository.com/artifact/org.abstractj.libmatthew/hexdump -->
<dependency>
<groupId>org.abstractj.libmatthew</groupId>
<artifactId>hexdump</artifactId>
<version>0.2.1</version>
</dependency>
然后我将 /usr/share/java/unix.jar
添加到 Java BuildPath->Libraries。
然后在“Java BuildPath->Libraries->unix.jar->Native Library Location”包含 /usr/lib/jni
路径
最后:命中运行。