如何解决使用module-info.java
我的Linux Java应用程序使用蓝牙设备。我使用此库是为了与bluez stack进行通信:https://github.com/hypfvieh/bluez-dbus。
在我向客户代码中添加module-info.java
之前,它一直运行良好。突然出现此错误:
线程“主”中的异常java.lang.UnsatisfiedLinkError:无法加载FFI提供程序jnr.ffi.provider.jffi.Provider 在jnr.ffi@2.1.15/jnr.ffi.provider.InvalidRuntime.newLoadError(InvalidRuntime.java:101) 在jnr.ffi@2.1.15/jnr.ffi.provider.InvalidRuntime.findType(InvalidRuntime.java:42) 在jnr.ffi@2.1.15/jnr.ffi.Struct$NumberField。(Struct.java:872) 在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) 在...
原因:java.lang.UnsatisfiedLinkError:无法获得类型
POINTER
的本机定义,原始错误消息如下:java.lang.UnsatisfiedLinkError:无法在jar文件中找到存根库。尝试过[jni / x86_64-Linux / libjffi-1.2.so,/ jni / x86_64-Linux / libjffi-1.2.so] 在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(本地方法) 在java.base / java.lang.Class.forName(Class.java:427) 在jffi@1.2.23/com.kenai.jffi.Init.load(Init.java:68) 在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.Foreign.getInstance(Foreign.java:103) 在jffi@1.2.23/com.kenai.jffi.Type$Builtin.lookupTypeInfo(Type.java:242) 在jffi@1.2.23/com.kenai.jffi.Type$Builtin.getTypeInfo(Type.java:237) 在jffi@1.2.23/com.kenai.jffi.Type.resolveSize(Type.java:155) 在jffi@1.2.23/com.kenai.jffi.Type.size(Type.java:138) 在jnr.ffi@2.1.15/jnr.ffi.provider.jffi.NativeRuntime$TypeDelegate.size(NativeRuntime.java:178) 在jnr.ffi@2.1.15/jnr.ffi.provider.AbstractRuntime。(AbstractRuntime.java:48) 在jnr.ffi@2.1.15/jnr.ffi.provider.jffi.NativeRuntime。(NativeRuntime.java:57) 在jnr.ffi@2.1.15/jnr.ffi.provider.jffi.NativeRuntime。(NativeRuntime.java:41) 在jnr.ffi@2.1.15/jnr.ffi.provider.jffi.NativeRuntime$SingletonHolder。(NativeRuntime.java:53) 在jnr.ffi@2.1.15/jnr.ffi.provider.jffi.NativeRuntime.getInstance(NativeRuntime.java:49) 在jnr.ffi@2.1.15/jnr.ffi.provider.jffi.Provider。(Provider.java:29) 在java.base / jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法) 在java.base / jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) 在java.base / jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 在java.base / java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:500) 在java.base / java.lang.reflect.ReflectAccess.newInstance(ReflectAccess.java:124) 在java.base / jdk.internal.reflect.ReflectionFactory.newInstance(ReflectionFactory.java:346) 在java.base / java.lang.Class.newInstance(Class.java:604) 在jnr.ffi@2.1.15/jnr.ffi.provider.FFIProvider$SystemProviderSingletonHolder.getInstance(FFIProvider.java:68) 在jnr.ffi@2.1.15/jnr.ffi.provider.FFIProvider$SystemProviderSingletonHolder。(FFIProvider.java:57) 在jnr.ffi@2.1.15/jnr.ffi.provider.FFIProvider.getSystemProvider(FFIProvider.java:35) 在jnr.ffi@2.1.15/jnr.ffi.Runtime$SingletonHolder。(Runtime.java:82) 在jnr.ffi@2.1.15/jnr.ffi.Runtime.getSystemRuntime(Runtime.java:67) 在jnr.unixsocket@0.33/jnr.unixsocket.SockAddrUnix。(SockAddrUnix.java:46) 在jnr.unixsocket@0.33/jnr.unixsocket.SockAddrUnix$DefaultSockAddrUnix。(SockAddrUnix.java:208) 在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) 在...
我试图在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;
}
谢谢。
解决方法
TL; DR
这对我有用...
java --patch-module jffi={{your.own.location}}/com/github/jnr/jffi/1.3.0/jffi-1.3.0-native.jar …
长版本
我下载了this example project。这不是JPMS项目。但是我将 module-info.java
文件添加到了四个子项目中的每一个。
我将项目的 com.github.jnr:jnr-ffi
依赖项从 2.0.9
更新为 2.1.5
以匹配版本我在您的堆栈跟踪中看到。我添加了以下依赖项...
…
<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
描述符中的每个描述符,使其与您的描述符非常相似...
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
之前,我运行了一个示例项目,并得到了与您完全相同的错误。
但是使用以下命令,所有示例应用程序都可以作为模块完美运行……
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-modules
和 add-exports
也至关重要。所以不要把那些留在外面。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。