pi4j-v2
pi4j-v2 copied to clipboard
pigpio cannot find libpigpio.so.1
Hello,
I am on NixOS and had no issues with the linuxfs plugin, but I am forced to use the pigpio provider.
When I run my app, I get the following stacktrace:
[main] ERROR com.pi4j.library.pigpio.util.NativeLibraryLoader - Unable to load/link [libpi4j-pigpio.so] using path: [/lib/aarch64/libpi4j-pigpio.so]
java.lang.UnsatisfiedLinkError: /tmp/libpi4j-pigpio12520870765546861753.so: libpigpio.so.1: cannot open shared object file: No such file or directory
at java.base/jdk.internal.loader.NativeLibraries.load(Native Method)
at java.base/jdk.internal.loader.NativeLibraries$NativeLibraryImpl.open(NativeLibraries.java:331)
at java.base/jdk.internal.loader.NativeLibraries.loadLibrary(NativeLibraries.java:197)
at java.base/jdk.internal.loader.NativeLibraries.loadLibrary(NativeLibraries.java:139)
at java.base/java.lang.ClassLoader.loadLibrary(ClassLoader.java:2418)
at java.base/java.lang.Runtime.load0(Runtime.java:852)
at java.base/java.lang.System.load(System.java:2025)
at com.pi4j.library.pigpio.util.NativeLibraryLoader.loadLibraryFromClasspath(NativeLibraryLoader.java:260)
at com.pi4j.library.pigpio.util.NativeLibraryLoader.load(NativeLibraryLoader.java:182)
at com.pi4j.library.pigpio.internal.PIGPIO.<clinit>(PIGPIO.java:74)
at com.pi4j.library.pigpio.impl.PiGpioNativeImpl.gpioInitialise(PiGpioNativeImpl.java:105)
at com.pi4j.library.pigpio.PiGpio.initialize(PiGpio.java:159)
at com.pi4j.plugin.pigpio.provider.pwm.PiGpioPwmProviderImpl.create(PiGpioPwmProviderImpl.java:73)
at com.pi4j.plugin.pigpio.provider.pwm.PiGpioPwmProviderImpl.create(PiGpioPwmProviderImpl.java:44)
at com.pi4j.context.Context.create(Context.java:344)
at com.pi4j.internal.IOCreator.create(IOCreator.java:58)
at com.pi4j.internal.IOCreator.create(IOCreator.java:116)
at me.micartey.esc.Main.main(Main.java:19)
Exception in thread "main" java.lang.UnsatisfiedLinkError: Pi4J was unable to extract and load the native library [/lib/aarch64/libpi4j-pigpio.so] from the embedded resources inside this JAR [/home/zero/pwm.jar]. to a temporary location on this system. You can alternatively define the 'pi4j.library.path' system property to override this behavior and specify the library path.
UNDERLYING EXCEPTION: [java.lang.UnsatisfiedLinkError]=/tmp/libpi4j-pigpio12520870765546861753.so: libpigpio.so.1: cannot open shared object file: No such file or directory
at com.pi4j.library.pigpio.util.NativeLibraryLoader.load(NativeLibraryLoader.java:203)
at com.pi4j.library.pigpio.internal.PIGPIO.<clinit>(PIGPIO.java:74)
at com.pi4j.library.pigpio.impl.PiGpioNativeImpl.gpioInitialise(PiGpioNativeImpl.java:105)
at com.pi4j.library.pigpio.PiGpio.initialize(PiGpio.java:159)
at com.pi4j.plugin.pigpio.provider.pwm.PiGpioPwmProviderImpl.create(PiGpioPwmProviderImpl.java:73)
at com.pi4j.plugin.pigpio.provider.pwm.PiGpioPwmProviderImpl.create(PiGpioPwmProviderImpl.java:44)
at com.pi4j.context.Context.create(Context.java:344)
at com.pi4j.internal.IOCreator.create(IOCreator.java:58)
at com.pi4j.internal.IOCreator.create(IOCreator.java:116)
at me.micartey.esc.Main.main(Main.java:19)
My understanding of this is the following:
- It fails to find the library on my system
- It tries to use the bundled binary instead
- The bundled binary fails to find
libpigpio.so.1
The issue is, that the binary is present, but in /nix/store/znwyjqbvwx1843z0gr1p0lm4260l4fik-pigpio-79/lib
Is there some way to handle this? Can I set some env variable to set the path?
EDIT I am a linux noob when it comes to native dependency stuff and finding binaries etc.
I noticed that the binary does not have the so.1 prefix... So I created a symlink and added the path to LD_LIBRARY_PATH
But now I get the following error:
[main] INFO com.pi4j.runtime.impl.DefaultRuntime - Pi4J context/runtime successfully initialized.
[main] WARN com.pi4j.library.pigpio.impl.PiGpioNativeImpl - PIGPIO ERROR: PI_INIT_FAILED; pigpio initialisation failed
Exception in thread "main" com.pi4j.library.pigpio.PiGpioException: PIGPIO ERROR: PI_INIT_FAILED; pigpio initialisation failed
at com.pi4j.library.pigpio.impl.PiGpioBase.validateResult(PiGpioBase.java:265)
at com.pi4j.library.pigpio.impl.PiGpioBase.validateResult(PiGpioBase.java:251)
at com.pi4j.library.pigpio.impl.PiGpioNativeImpl.gpioInitialise(PiGpioNativeImpl.java:110)
at com.pi4j.library.pigpio.PiGpio.initialize(PiGpio.java:159)
at com.pi4j.plugin.pigpio.provider.pwm.PiGpioPwmProviderImpl.create(PiGpioPwmProviderImpl.java:73)
at com.pi4j.plugin.pigpio.provider.pwm.PiGpioPwmProviderImpl.create(PiGpioPwmProviderImpl.java:44)
at com.pi4j.context.Context.create(Context.java:344)
at com.pi4j.internal.IOCreator.create(IOCreator.java:58)
at com.pi4j.internal.IOCreator.create(IOCreator.java:116)
at me.micartey.esc.Main.main(Main.java:19)