#java #linux #bluetooth #java-module #jnr
#java #linux #bluetooth #java-модуль #jnr
Вопрос:
мое приложение Linux Java использует устройства Bluetooth. Я использую эту библиотеку для связи со стеком bluez : https://github.com/hypfvieh/bluez-dbus .
Это работало очень хорошо, пока я не добавил module-info.java
в свой клиентский код. Внезапно я получил эту ошибку:
Исключение в потоке «main» 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 $Числовое поле.(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 .Адрес UNIXSOCKET.(Unixsocket Address.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.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 .Внешний $InstanceHolder.(Foreign.java:45) в jffi@1.2.23/com.kenai.jffi .Foreign.getInstance(Foreign.java: 103) в jffi@1.2.23/com.kenai.jffi .Введите $Builtin.lookupTypeInfo(Type.java:242) в jffi@1.2.23/com.kenai.jffi .Введите $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.Делегирование constructoraccessorimpl.newInstance(делегирование constructoraccessorimpl.java:45) в java.base/java.lang.reflect.Конструктор.newInstanceWithCaller(Constructor.java:500) в java.base/java.lang.reflect.ReflectAccess.newInstance(ReflectAccess.java:124) на java.base/jdk.internal.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 .Адрес UNIXSOCKET.(Unixsocket Address.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;
}
Заранее благодарю вас.
Ответ №1:
TL; DR
Это сработало для меня…
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.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
также имеют решающее значение. Так что не оставляйте их.