1

我的 Linux Java 应用程序使用蓝牙设备。我使用这个库来与 bluez stack 通信:https ://github.com/hypfvieh/bluez-dbus 。

在我添加module-info.java到我的客户端代码之前,它运行良好。突然我得到这个错误:

线程“主”java.lang.UnsatisfiedLinkError 中的异常:无法在 jnr.ffi@2.1.15/jnr.ffi.provider.InvalidRuntime.newLoadError 加载 FFI 提供程序 jnr.ffi.provider.jffi.Provider(InvalidRuntime.java:101 ) 在 jnr.ffi@2.1.15/jnr.ffi.Struct$NumberField.(Struct.java:872) 在 jnr.ffi@2.1.15/jnr.ffi.provider.InvalidRuntime.findType(InvalidRuntime.java:42)在 jnr.ffi@2.1.15/jnr.ffi.Struct$Unsigned16.(Struct.java:1240) 在 jnr.unixsocket@0.33/jnr.unixsocket.SockAddrUnix$DefaultSockAddrUnix.(SockAddrUnix.java:209) 在 jnr.unixsocket @0.33/jnr.unixsocket.SockAddrUnix.create(SockAddrUnix.java:174) 在 jnr.unixsocket@0.33/jnr.unixsocket.UnixSocketAddress.(UnixSocketAddress.java:53) 在 dbus.java@3.2.3/org.freedesktop。 dbus.connections.transports.UnixSocketTransport.(UnixSocketTransport.java:32) 在 dbus.java@3.2.3/org.freedesktop.dbus.connections。transports.TransportFactory.createTransport(TransportFactory.java:37) 在 dbus.java@3.2.3/org.freedesktop.dbus.connections.AbstractConnection.(AbstractConnection.java:161) 在 dbus.java@3.2.3/org.freedesktop .dbus.connections.impl.DBusConnection.(DBusConnection.java:334) 在 dbus.java@3.2.3/org.freedesktop.dbus.connections.impl.DBusConnection.getConnection(DBusConnection.java:149) 在 dbus.java@ 3.2.3/org.freedesktop.dbus.connections.impl.DBusConnection.getConnection(DBusConnection.java:169) 在 dbus.java@3.2.3/org.freedesktop.dbus.connections.impl.DBusConnection.getConnection(DBusConnection.java :219) 在 dbus.java@3.2.3/org.freedesktop.dbus.connections.impl.DBusConnection.getConnection(DBusConnection.java:184) 在 bluez.dbus@0.1.3/com.github.hypfvieh.bluetooth.DeviceManager .createInstance(DeviceManager.java:74) 在...createTransport(TransportFactory.java:37) 在 dbus.java@3.2.3/org.freedesktop.dbus.connections.AbstractConnection.(AbstractConnection.java:161) 在 dbus.java@3.2.3/org.freedesktop.dbus.connections .impl.DBusConnection.(DBusConnection.java:334) 在 dbus.java@3.2.3/org.freedesktop.dbus.connections.impl.DBusConnection.getConnection(DBusConnection.java:149) 在 dbus.java@3.2.3/ org.freedesktop.dbus.connections.impl.DBusConnection.getConnection(DBusConnection.java:169) 在 dbus.java@3.2.3/org.freedesktop.dbus.connections.impl.DBusConnection.getConnection(DBusConnection.java:219) 在dbus.java@3.2.3/org.freedesktop.dbus.connections.impl.DBusConnection.getConnection(DBusConnection.java:184) 在 bluez.dbus@0.1.3/com.github.hypfvieh.bluetooth.DeviceManager.createInstance(DeviceManager .java:74) 在...createTransport(TransportFactory.java:37) 在 dbus.java@3.2.3/org.freedesktop.dbus.connections.AbstractConnection.(AbstractConnection.java:161) 在 dbus.java@3.2.3/org.freedesktop.dbus.connections .impl.DBusConnection.(DBusConnection.java:334) 在 dbus.java@3.2.3/org.freedesktop.dbus.connections.impl.DBusConnection.getConnection(DBusConnection.java:149) 在 dbus.java@3.2.3/ org.freedesktop.dbus.connections.impl.DBusConnection.getConnection(DBusConnection.java:169) 在 dbus.java@3.2.3/org.freedesktop.dbus.connections.impl.DBusConnection.getConnection(DBusConnection.java:219) 在dbus.java@3.2.3/org.freedesktop.dbus.connections.impl.DBusConnection.getConnection(DBusConnection.java:184) 在 bluez.dbus@0.1.3/com.github.hypfvieh.bluetooth.DeviceManager.createInstance(DeviceManager .java:74) 在...dbus.java@3.2.3/org.freedesktop.dbus.connections.impl.DBusConnection.(DBusConnection.java:334) 上的connections.AbstractConnection.(AbstractConnection.java:161) dbus.java@3.2.3/org。 freedesktop.dbus.connections.impl.DBusConnection.getConnection(DBusConnection.java:149) 在 dbus.java@3.2.3/org.freedesktop.dbus.connections.impl.DBusConnection.getConnection(DBusConnection.java:169) 在 dbus。 java@3.2.3/org.freedesktop.dbus.connections.impl.DBusConnection.getConnection(DBusConnection.java:219) 在 dbus.java@3.2.3/org.freedesktop.dbus.connections.impl.DBusConnection.getConnection(DBusConnection .java:184) 在 bluez.dbus@0.1.3/com.github.hypfvieh.bluetooth.DeviceManager.createInstance(DeviceManager.java:74) 在 ...dbus.java@3.2.3/org.freedesktop.dbus.connections.impl.DBusConnection.(DBusConnection.java:334) 上的connections.AbstractConnection.(AbstractConnection.java:161) dbus.java@3.2.3/org。 freedesktop.dbus.connections.impl.DBusConnection.getConnection(DBusConnection.java:149) 在 dbus.java@3.2.3/org.freedesktop.dbus.connections.impl.DBusConnection.getConnection(DBusConnection.java:169) 在 dbus。 java@3.2.3/org.freedesktop.dbus.connections.impl.DBusConnection.getConnection(DBusConnection.java:219) 在 dbus.java@3.2.3/org.freedesktop.dbus.connections.impl.DBusConnection.getConnection(DBusConnection .java:184) 在 bluez.dbus@0.1.3/com.github.hypfvieh.bluetooth.DeviceManager.createInstance(DeviceManager.java:74) 在 ...334) 在 dbus.java@3.2.3/org.freedesktop.dbus.connections.impl.DBusConnection.getConnection(DBusConnection.java:149) 在 dbus.java@3.2.3/org.freedesktop.dbus.connections.impl。 DBusConnection.getConnection(DBusConnection.java:169) 在 dbus.java@3.2.3/org.freedesktop.dbus.connections.impl.DBusConnection.getConnection(DBusConnection.java:219) 在 dbus.java@3.2.3/org。 freedesktop.dbus.connections.impl.DBusConnection.getConnection(DBusConnection.java:184) 在 bluez.dbus@0.1.3/com.github.hypfvieh.bluetooth.DeviceManager.createInstance(DeviceManager.java:74) 在 ...334) 在 dbus.java@3.2.3/org.freedesktop.dbus.connections.impl.DBusConnection.getConnection(DBusConnection.java:149) 在 dbus.java@3.2.3/org.freedesktop.dbus.connections.impl。 DBusConnection.getConnection(DBusConnection.java:169) 在 dbus.java@3.2.3/org.freedesktop.dbus.connections.impl.DBusConnection.getConnection(DBusConnection.java:219) 在 dbus.java@3.2.3/org。 freedesktop.dbus.connections.impl.DBusConnection.getConnection(DBusConnection.java:184) 在 bluez.dbus@0.1.3/com.github.hypfvieh.bluetooth.DeviceManager.createInstance(DeviceManager.java:74) 在 ...getConnection(DBusConnection.java:219) 在 dbus.java@3.2.3/org.freedesktop.dbus.connections.impl.DBusConnection.getConnection(DBusConnection.java:184) 在 bluez.dbus@0.1.3/com.github。 hypfvieh.bluetooth.DeviceManager.createInstance(DeviceManager.java:74) 在 ...getConnection(DBusConnection.java:219) 在 dbus.java@3.2.3/org.freedesktop.dbus.connections.impl.DBusConnection.getConnection(DBusConnection.java:184) 在 bluez.dbus@0.1.3/com.github。 hypfvieh.bluetooth.DeviceManager.createInstance(DeviceManager.java:74) 在 ...

原因:java.lang.UnsatisfiedLinkError: could not get native definition for typePOINTER,原始错误消息如下:java.lang.UnsatisfiedLinkError: could not locate stub library in jar file。在 jffi@1.2.23/com.kenai.jffi.internal.StubLoader.getStubLibraryStream(StubLoader.java: 450) 在 jffi@1.2.23/com.kenai.jffi.internal.StubLoader.loadFromJar(StubLoader.java:375) 在 jffi@1.2.23/com.kenai.jffi.internal.StubLoader.load(StubLoader.java: 278) 在 jffi@1.2.23/com.kenai.jffi.internal.StubLoader.(StubLoader.java:487) 在 java.base/java.lang.Class.forName0(Native Method) 在 java.base/java.lang .Class.forName(Class.java:427) at jffi@1.2.23/com.kenai.jffi.Init.load(Init.java:68) at jffi@1.2.23/com.kenai.jffi.Foreign$InstanceHolder .getInstanceHolder(Foreign.java:49) 在 jffi@1.2.23/com.kenai.jffi.Foreign$InstanceHolder.(Foreign.java:45) 在 jffi@1.2.23/com.kenai.jffi。

我试图在 module-info.java 中要求与此错误相关的所有内容,但没有成功:

module org.example {
    requires dbus.java;
    requires dbus.java.nativefd;
    requires bluecove.linux.custom;
    requires bluez.dbus;
    requires jnr.ffi;
    requires jnr.x86asm;
    requires jnr.posix;
    requires jnr.enxio;
    requires jnr.unixsocket;
    requires jnr.constants;
    requires jnr.a64asm;
}

先感谢您。

4

1 回答 1

1

TL;博士

这对我有用……</p>

java --patch-module jffi={{your.own.location}}/com/github/jnr/jffi/1.3.0/jffi-1.3.0-native.jar …

长版

我下载了这个示例项目。这不是 JPMS 项目。但是我向module-info.java四个子项目中的每一个都添加了文件。

我将项目的com.github.jnr:jnr-ffi依赖项从2.0.9to更新2.1.5为与我在堆栈跟踪中看到的版本相匹配。我添加了以下依赖项...</p>

…
<dependency>
    <groupId>com.github.hypfvieh</groupId>
    <artifactId>dbus-java</artifactId>
    <version>3.2.3</version>
</dependency>
<dependency>
    <groupId>com.github.hypfvieh</groupId> <artifactId>bluez-dbus</artifactId>
    <version>0.1.3</version>
</dependency>
<dependency>
    <groupId>com.rm5248</groupId>
    <artifactId>dbus-java-nativefd</artifactId>
    <version>1.0</version>
</dependency>
…

添加这些是为了让我可以将我的四个module-info.java描述符中的每一个都定义为与您的非常相似……</p>

module get.pid{
    exports getpid;
    requires dbus.java;
    requires dbus.java.nativefd;
    requires bluez.dbus;
    requires jnr.ffi;
    requires jffi;
    requires jnr.x86asm;
    requires jnr.posix;
    requires jnr.enxio;
    requires jnr.unixsocket;
    requires jnr.constants;
    requires jnr.a64asm;
}

在我做之前--patch-module,我运行了一个示例项目并得到了与你完全相同的错误。

但是使用以下命令,所有示例应用程序都可以作为模块运行得非常好……</p>

java --patch-module jffi={{your.own.location}}/com/github/jnr/jffi/1.3.0/jffi-1.3.0-native.jar --add-modules org.objectweb.asm --add-exports org.objectweb.asm/org.objectweb.asm=jnr.ffi --add-exports org.objectweb.asm/org.objectweb.asm.signature=jnr.ffi --module-path {{path.to.all.the.jars}} -m get.pid/getpid.Getpid

add-modulesadd-exports很关键。所以不要遗漏那些。

于 2020-09-19T01:59:19.447 回答