如何在 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 库是我必须通过发行版的包管理器引入的答案吗? emergeapt-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 项目执行了以下操作。该项目具有以下依赖项:

  1. libdbus-java-2.7.jar(项目已经包含这个jar)
  2. /usr/share/java/unix.jar(通过安装 debian 软件包并从中添加 jar 感到满意)
  3. /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 路径

最后:命中运行。