bytedeco / javacv

Java interface to OpenCV, FFmpeg, and more
Other
7.45k stars 1.57k forks source link

Run on Raspberry Pi prompting errors:java.lang.UnsatisfiedLinkError: no jniopenblas_nolapack in java.library.path: /usr/java/packages/lib:/lib:/usr/lib #2001

Closed visionki closed 1 year ago

visionki commented 1 year ago

I need to use JavaCV on my Raspberry Pi to take pictures, but my development environment is Windows.

The maven dependencies I introduced are:

        <dependency>
            <groupId>org.bytedeco</groupId>
            <artifactId>javacv-platform</artifactId>
            <version>1.5.8</version>
        </dependency>

The code snippet is as follows:

      try (FrameGrabber grabber = new OpenCVFrameGrabber(0);
           OpenCVFrameConverter.ToIplImage converter = new OpenCVFrameConverter.ToIplImage()){
         grabber.start();
         for (int i = 0; i < 10; i++) {
            Frame frame = grabber.grab();
            IplImage img = converter.convert(frame);
            opencv_imgcodecs.cvSaveImage(System.currentTimeMillis() + ".jpg", img);
         }
      } catch (FrameGrabber.Exception e) {
         throw new RuntimeException(e);
      }

This works fine on Windows, but when I use mvn package to package it and run it on Raspberry Pi, I get the java.lang.UnsatisfiedLinkError: no jniopenblas_nolapack in java.library.path: /usr/java/ packages/lib:/lib:/usr/lib error。

The full error is as follows:

java.lang.UnsatisfiedLinkError: no jniopenblas_nolapack in java.library.path: /usr/java/packages/lib:/lib:/usr/lib
    at java.base/java.lang.ClassLoader.loadLibrary(ClassLoader.java:2429) ~[na:na]
    at java.base/java.lang.Runtime.loadLibrary0(Runtime.java:818) ~[na:na]
    at java.base/java.lang.System.loadLibrary(System.java:1989) ~[na:na]
    at org.bytedeco.javacpp.Loader.loadLibrary(Loader.java:1825) ~[javacpp-1.5.8.jar!/:1.5.8]
    at org.bytedeco.javacpp.Loader.load(Loader.java:1416) ~[javacpp-1.5.8.jar!/:1.5.8]
    at org.bytedeco.javacpp.Loader.load(Loader.java:1227) ~[javacpp-1.5.8.jar!/:1.5.8]
    at org.bytedeco.javacpp.Loader.load(Loader.java:1203) ~[javacpp-1.5.8.jar!/:1.5.8]
    at org.bytedeco.openblas.global.openblas_nolapack.<clinit>(openblas_nolapack.java:12) ~[openblas-0.3.21-1.5.8.jar!/:0.3.21-1.5.8]
    at java.base/java.lang.Class.forName0(Native Method) ~[na:na]
    at java.base/java.lang.Class.forName(Class.java:467) ~[na:na]
    at org.bytedeco.javacpp.Loader.load(Loader.java:1282) ~[javacpp-1.5.8.jar!/:1.5.8]
    at org.bytedeco.javacpp.Loader.load(Loader.java:1227) ~[javacpp-1.5.8.jar!/:1.5.8]
    at org.bytedeco.javacpp.Loader.load(Loader.java:1219) ~[javacpp-1.5.8.jar!/:1.5.8]
    at org.bytedeco.javacv.OpenCVFrameConverter.<clinit>(OpenCVFrameConverter.java:43) ~[javacv-1.5.8.jar!/:1.5.8]
    at org.bytedeco.javacv.OpenCVFrameGrabber.<init>(OpenCVFrameGrabber.java:95) ~[javacv-1.5.8.jar!/:1.5.8]
    at com.axon.camera.StartService.run(StartService.java:32) ~[classes!/:0.0.1-SNAPSHOT]
    at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:760) ~[spring-boot-3.0.5.jar!/:3.0.5]
    at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:750) ~[spring-boot-3.0.5.jar!/:3.0.5]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:317) ~[spring-boot-3.0.5.jar!/:3.0.5]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1304) ~[spring-boot-3.0.5.jar!/:3.0.5]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1293) ~[spring-boot-3.0.5.jar!/:3.0.5]
    at com.axon.camera.CameraApplication.main(CameraApplication.java:13) ~[classes!/:0.0.1-SNAPSHOT]
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na]
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
    at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na]
    at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:49) ~[camera.jar:0.0.1-SNAPSHOT]
    at org.springframework.boot.loader.Launcher.launch(Launcher.java:95) ~[camera.jar:0.0.1-SNAPSHOT]
    at org.springframework.boot.loader.Launcher.launch(Launcher.java:58) ~[camera.jar:0.0.1-SNAPSHOT]
    at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:65) ~[camera.jar:0.0.1-SNAPSHOT]
Caused by: java.lang.UnsatisfiedLinkError: Could not find jniopenblas_nolapack in class, module, and library paths.
    at org.bytedeco.javacpp.Loader.loadLibrary(Loader.java:1792) ~[javacpp-1.5.8.jar!/:1.5.8]
    ... 26 common frames omitted

Is there a dependent library missing?

visionki commented 1 year ago

I've tried maven direct mvn package packaging and platform specific packaging mvn -Djavacpp.platform=linux-armhf -Djavacpp.arch=arm package, but both have the same error

saudet commented 1 year ago

Please set the "org.bytedeco.javacpp.logger.debug" system property to "true" to get more information on the console.

zBo1997 commented 1 year ago

what's your JDK version?

zBo1997 commented 1 year ago

https://stackoverflow.com/questions/55210579/deeplearning4j-error-no-jniopenblas-in-java-library-path

"plan B"

visionki commented 1 year ago

Please set the "org.bytedeco.javacpp.logger.debug" system property to "true" to get more information on the console.

The console I get after using System.setProperty("org.bytedeco.javacpp.logger.debug", "true"); is as follows:

# java -jar camera.jar 

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::                (v3.0.5)

2023-03-25T13:45:18.308+08:00  INFO 5669 --- [           main] com.axon.camera.CameraApplication        : Starting CameraApplication v0.0.1-SNAPSHOT using Java 17.0.6 with PID 5669 (/home/emily/server/camera/camera.jar started by emily in /home/emily/server/camera)
2023-03-25T13:45:18.319+08:00  INFO 5669 --- [           main] com.axon.camera.CameraApplication        : No active profile set, falling back to 1 default profile: "default"
2023-03-25T13:45:21.400+08:00  INFO 5669 --- [           main] com.axon.camera.CameraApplication        : Started CameraApplication in 5.289 seconds (process running for 8.69)
2023-03-25T13:45:21.421+08:00  INFO 5669 --- [           main] com.axon.camera.StartService             : 开始加载
Debug: Loading class org.bytedeco.javacpp.presets.javacpp
Debug: Loading class org.bytedeco.javacpp.Loader
Debug: Loading library jnijavacpp
Debug: Failed to load for jnijavacpp: java.lang.UnsatisfiedLinkError: no jnijavacpp in java.library.path: /usr/java/packages/lib:/lib:/usr/lib
Debug: Could not load Loader: java.lang.UnsatisfiedLinkError: no jnijavacpp in java.library.path: /usr/java/packages/lib:/lib:/usr/lib
Debug: Loading class org.bytedeco.javacpp.presets.javacpp
Debug: Loading class org.bytedeco.openblas.global.openblas_nolapack
Debug: Loading class org.bytedeco.javacpp.presets.javacpp
Debug: Loading class org.bytedeco.openblas.global.openblas_nolapack
Debug: Loading library gcc_s
Debug: Failed to load for gcc_s@.1: java.lang.UnsatisfiedLinkError: no gcc_s in java.library.path: /usr/java/packages/lib:/lib:/usr/lib
Debug: Loading library quadmath
Debug: Failed to load for quadmath@.0: java.lang.UnsatisfiedLinkError: no quadmath in java.library.path: /usr/java/packages/lib:/lib:/usr/lib
Debug: Loading library gfortran
Debug: Failed to load for gfortran@.5: java.lang.UnsatisfiedLinkError: no gfortran in java.library.path: /usr/java/packages/lib:/lib:/usr/lib
Debug: Loading library gfortran
Debug: Failed to load for gfortran@.4: java.lang.UnsatisfiedLinkError: no gfortran in java.library.path: /usr/java/packages/lib:/lib:/usr/lib
Debug: Loading library gfortran
Debug: Failed to load for gfortran@.3: java.lang.UnsatisfiedLinkError: no gfortran in java.library.path: /usr/java/packages/lib:/lib:/usr/lib
Debug: Loading library openblas
Debug: Failed to load for openblas@.0#openblas_nolapack@.0: java.lang.UnsatisfiedLinkError: no openblas in java.library.path: /usr/java/packages/lib:/lib:/usr/lib
Debug: Loading library openblas_nolapack
Debug: Failed to load for openblas_nolapack@.0: java.lang.UnsatisfiedLinkError: no openblas_nolapack in java.library.path: /usr/java/packages/lib:/lib:/usr/lib
Debug: Loading library jniopenblas_nolapack
Debug: Failed to load for jniopenblas_nolapack: java.lang.UnsatisfiedLinkError: no jniopenblas_nolapack in java.library.path: /usr/java/packages/lib:/lib:/usr/lib
2023-03-25T13:45:22.427+08:00  INFO 5669 --- [           main] .s.b.a.l.ConditionEvaluationReportLogger : 

Error starting ApplicationContext. To display the condition evaluation report re-run your application with 'debug' enabled.
2023-03-25T13:45:22.551+08:00 ERROR 5669 --- [           main] o.s.boot.SpringApplication               : Application run failed

java.lang.UnsatisfiedLinkError: no jniopenblas_nolapack in java.library.path: /usr/java/packages/lib:/lib:/usr/lib
    at java.base/java.lang.ClassLoader.loadLibrary(ClassLoader.java:2429) ~[na:na]
    at java.base/java.lang.Runtime.loadLibrary0(Runtime.java:818) ~[na:na]
    at java.base/java.lang.System.loadLibrary(System.java:1989) ~[na:na]
    at org.bytedeco.javacpp.Loader.loadLibrary(Loader.java:1825) ~[javacpp-1.5.8.jar!/:1.5.8]
    at org.bytedeco.javacpp.Loader.load(Loader.java:1416) ~[javacpp-1.5.8.jar!/:1.5.8]
    at org.bytedeco.javacpp.Loader.load(Loader.java:1227) ~[javacpp-1.5.8.jar!/:1.5.8]
    at org.bytedeco.javacpp.Loader.load(Loader.java:1203) ~[javacpp-1.5.8.jar!/:1.5.8]
    at org.bytedeco.openblas.global.openblas_nolapack.<clinit>(openblas_nolapack.java:12) ~[openblas-0.3.21-1.5.8.jar!/:0.3.21-1.5.8]
    at java.base/java.lang.Class.forName0(Native Method) ~[na:na]
    at java.base/java.lang.Class.forName(Class.java:467) ~[na:na]
    at org.bytedeco.javacpp.Loader.load(Loader.java:1282) ~[javacpp-1.5.8.jar!/:1.5.8]
    at org.bytedeco.javacpp.Loader.load(Loader.java:1227) ~[javacpp-1.5.8.jar!/:1.5.8]
    at org.bytedeco.javacpp.Loader.load(Loader.java:1219) ~[javacpp-1.5.8.jar!/:1.5.8]
    at org.bytedeco.javacv.OpenCVFrameConverter.<clinit>(OpenCVFrameConverter.java:43) ~[javacv-1.5.8.jar!/:1.5.8]
    at org.bytedeco.javacv.OpenCVFrameGrabber.<init>(OpenCVFrameGrabber.java:95) ~[javacv-1.5.8.jar!/:1.5.8]
    at com.axon.camera.StartService.run(StartService.java:33) ~[classes!/:0.0.1-SNAPSHOT]
    at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:760) ~[spring-boot-3.0.5.jar!/:3.0.5]
    at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:750) ~[spring-boot-3.0.5.jar!/:3.0.5]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:317) ~[spring-boot-3.0.5.jar!/:3.0.5]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1304) ~[spring-boot-3.0.5.jar!/:3.0.5]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1293) ~[spring-boot-3.0.5.jar!/:3.0.5]
    at com.axon.camera.CameraApplication.main(CameraApplication.java:13) ~[classes!/:0.0.1-SNAPSHOT]
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na]
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
    at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na]
    at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:49) ~[camera.jar:0.0.1-SNAPSHOT]
    at org.springframework.boot.loader.Launcher.launch(Launcher.java:95) ~[camera.jar:0.0.1-SNAPSHOT]
    at org.springframework.boot.loader.Launcher.launch(Launcher.java:58) ~[camera.jar:0.0.1-SNAPSHOT]
    at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:65) ~[camera.jar:0.0.1-SNAPSHOT]
Caused by: java.lang.UnsatisfiedLinkError: Could not find jniopenblas_nolapack in class, module, and library paths.
    at org.bytedeco.javacpp.Loader.loadLibrary(Loader.java:1792) ~[javacpp-1.5.8.jar!/:1.5.8]
    ... 26 common frames omitted

I understand that JavaCV depends on the OpenCV library and FFmpeg, and I already have them installed on the Raspberry Pi, are there any dependencies I'm missing?

visionki commented 1 year ago

what's your JDK version?

I am using openjdk 17

# java -version
openjdk version "17.0.6" 2023-01-17
OpenJDK Runtime Environment Temurin-17.0.6+10 (build 17.0.6+10)
OpenJDK Server VM Temurin-17.0.6+10 (build 17.0.6+10, mixed mode, sharing)
saudet commented 1 year ago

What do you get if you call Loader.getPlatform()? And what are the values of the "os.arch" and "os.name" system properties?

visionki commented 1 year ago

What do you get if you call Loader.getPlatform()? And what are the values of the "os.arch" and "os.name" system properties?

The call to Loader.getPlatform() return linux-arm

Here is the information about the system:

$ uname -a
Linux raspberrypi 6.1.19-v8+ #1637 SMP PREEMPT Tue Mar 14 11:11:47 GMT 2023 aarch64 GNU/Linux
$ cat /proc/version
Linux version 6.1.19-v8+ (dom@buildbot) (aarch64-linux-gnu-gcc-8 (Ubuntu/Linaro 8.4.0-3ubuntu1) 8.4.0, GNU ld (GNU Binutils for Ubuntu) 2.34) #1637 SMP PREEMPT Tue Mar 14 11:11:47 GMT 2023
saudet commented 1 year ago

I mean, what do you get if you call System.getProperty("os.arch") and System.getProperty("os.name") in Java?

visionki commented 1 year ago

I mean, what do you get if you call System.getProperty("os.arch") and System.getProperty("os.name") in Java?

The printout reads:

os.arch: arm
os.name: Linux
saudet commented 1 year ago

What about "java.vm.name", "sun.arch.abi", and "sun.boot.library.path"?

visionki commented 1 year ago

What about "java.vm.name", "sun.arch.abi", and "sun.boot.library.path"?

java.vm.name: OpenJDK Server VM
sun.arch.abi: 
sun.boot.library.path: /usr/lib/jvm/temurin-17-jdk-armhf/lib

where sun.arch.abi does not print out the contents

saudet commented 1 year ago

Ah, ok, so you are using a 32-bit JDK. We'll need to update the hack from @vb216 that checks for "openjdk-armhf" in "sun.boot.library.path" to just "armhf", I guess. For now, you can work around that by setting the "org.bytedeco.javacpp.platform" system property to "linux-armhf".

visionki commented 1 year ago

@saudet Great! He is now working properly, thank you very much!

zBo1997 commented 1 year ago

@visionki hey! Could I get your contact information?

saudet commented 1 year ago

Fix released with JavaCPP 1.5.9! Thanks for reporting

highwayhu commented 3 months ago

Ah, ok, so you are using a 32-bit JDK. We'll need to update the hack from @vb216 that checks for "openjdk-armhf" in "sun.boot.library.path" to just "armhf", I guess. For now, you can work around that by setting the "org.bytedeco.javacpp.platform" system property to "linux-armhf".

@visionki hi, I'm experiencing the same issue. My environment variable is

javacpp platform: linux-x86_64 os.arch: amd64 os.name: Linux sun.boot.library.path: /opt/taobao/install/ajdk-8_10_15_fp11-b50-dep/jre/lib/amd64 org.bytedeco.javacpp.platform: null

. Could you kindly advise on how to resolve this?

saudet commented 3 months ago

That sounds like something going awry with static initialization. Please try to call Loader.Detector.getPlatform() instead.

manju22412 commented 1 month ago

There are few other openblas os related jars, like [openblas-0.3.26-1.5.10-linux-x86_64.jar, openblas-0.3.26-1.5.10-macosx-arm64.jar, openblas-0.3.26-1.5.10-macosx-x86_64.jar]. By adding above respective os jar along with normal openblas jar, will resolve the issue.