bytedeco / javacpp

The missing bridge between Java and native C++
Other
4.48k stars 581 forks source link

UnsatisfiedLinkError: no jniopencv_core on NVIDIA Jetson TX2 #599

Open nickgaray opened 2 years ago

nickgaray commented 2 years ago

I am building a process for OpenSensorHub on Jetson TX2 using Gradle and I am getting an error when initializing the process: UnsatisfiedLinkError: no jniopencv_core

My build.gradle dependencies are setup as follows:

dependencies {
    implementation 'org.sensorhub:sensorhub-core:' + oshCoreVersion
    implementation project(':sensorhub-driver-videocam')
    embeddedImpl 'org.jcodec:jcodec-javase:0.1.9'
    embeddedImpl group: 'org.bytedeco', name: 'javacv-platform', version: '1.5.7'
    embeddedImpl group: 'org.bytedeco.javacpp-presets', name: 'opencv', version: '4.0.1-1.4.4'
    embeddedImpl group: 'org.bytedeco', name: 'cuda', version: '11.6-8.3-1.5.7', classifier: 'linux-arm64'
    testImplementation('junit:junit:4.13')
}

I have also tried, with the same effect, no jniopencv_core

dependencies {
    implementation 'org.sensorhub:sensorhub-core:' + oshCoreVersion
    implementation project(':sensorhub-driver-videocam')
    embeddedImpl 'org.jcodec:jcodec-javase:0.1.9'
    embeddedImpl group: 'org.bytedeco', name: 'javacv-platform', version: '1.5.7'
    embeddedImpl 'org.bytedeco:javacpp-presets:1.5.7'
    embeddedImpl group: 'org.bytedeco.javacpp-presets', name: 'opencv', version: '4.0.1-1.4.4'
    embeddedImpl group: 'org.bytedeco', name: 'cuda', version: '11.6-8.3-1.5.7', classifier: 'linux-arm64'
    testImplementation('junit:junit:4.13')
}

The packaging of dependencies is working correctly, however I cannot seem to get the jniopencv_core issue resolved. I read that it was necessary to include the org.bytedeco:javacpp-presets as I did above. As an aside, is there currently no classifier for this package to only select the jars for a particular architecture?

The full error log is given:

2022-09-01 12:00:15.594 ERROR SMLProcessImpl:d3b84935 [ForkJoinPool.commonPool-worker-3] - Error initializing SML process
java.util.concurrent.CompletionException: java.lang.UnsatisfiedLinkError: no jniopencv_core in java.library.path: [/usr/local/cuda-10.2/lib64, ., /usr/java/packages/lib, /usr/lib/aarch64-linux-gnu/jni, /lib/aarch64-linux-gnu, /usr/lib/aarch64-linux-gnu, /usr/lib/jni, /lib, /usr/lib]
        at java.base/java.util.concurrent.CompletableFuture.encodeThrowable(CompletableFuture.java:314)
        at java.base/java.util.concurrent.CompletableFuture.completeThrowable(CompletableFuture.java:319)
        at java.base/java.util.concurrent.CompletableFuture$AsyncRun.run(CompletableFuture.java:1739)
        at java.base/java.util.concurrent.CompletableFuture$AsyncRun.exec(CompletableFuture.java:1728)
        at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:290)
        at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1020)
        at java.base/java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1656)
        at java.base/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1594)
        at java.base/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:183)
Caused by: java.lang.UnsatisfiedLinkError: no jniopencv_core in java.library.path: [/usr/local/cuda-10.2/lib64, ., /usr/java/packages/lib, /usr/lib/aarch64-linux-gnu/jni, /lib/aarch64-linux-gnu, /usr/lib/aarch64-linux-gnu, /usr/lib/jni, /lib, /usr/lib]
        at java.base/java.lang.ClassLoader.loadLibrary(ClassLoader.java:2670)
        at java.base/java.lang.Runtime.loadLibrary0(Runtime.java:830)
        at java.base/java.lang.System.loadLibrary(System.java:1873)
        at NativeClassLoader//org.bytedeco.javacpp.Loader.loadLibrary(Loader.java:1800)
        at NativeClassLoader//org.bytedeco.javacpp.Loader.load(Loader.java:1402)
        at NativeClassLoader//org.bytedeco.javacpp.Loader.load(Loader.java:1214)
        at NativeClassLoader//org.bytedeco.javacpp.Loader.load(Loader.java:1190)
        at NativeClassLoader//org.bytedeco.javacpp.opencv_core.<clinit>(opencv_core.java:10)
        at java.base/java.lang.Class.forName0(Native Method)
        at java.base/java.lang.Class.forName(Class.java:398)
        at NativeClassLoader//org.bytedeco.javacpp.Loader.load(Loader.java:1269)
        at NativeClassLoader//org.bytedeco.javacpp.Loader.load(Loader.java:1214)
        at NativeClassLoader//org.bytedeco.javacpp.Loader.load(Loader.java:1190)
        at NativeClassLoader//org.bytedeco.javacpp.opencv_core$Algorithm.<clinit>(opencv_core.java:15354)
        at NativeClassLoader//com.botts.process.image.FeatureDetectionProcess.loadClassifiers(FeatureDetectionProcess.java:196)
        at NativeClassLoader//com.botts.process.image.FeatureDetectionProcess.init(FeatureDetectionProcess.java:125)
        at NativeClassLoader//org.vast.process.ExecutableChainImpl.init(ExecutableChainImpl.java:263)
        at NativeClassLoader//org.vast.sensorML.AbstractProcessImpl.init(AbstractProcessImpl.java:223)
        at NativeClassLoader//org.sensorhub.impl.processing.SMLProcessImpl.initChain(SMLProcessImpl.java:125)
        at NativeClassLoader//org.sensorhub.impl.processing.SMLProcessImpl.lambda$doInit$0(SMLProcessImpl.java:107)
        at NativeClassLoader//org.sensorhub.utils.Lambdas.lambda$checked$0(Lambdas.java:66)
        at java.base/java.util.concurrent.CompletableFuture$AsyncRun.run(CompletableFuture.java:1736)
        ... 6 common frames omitted
Caused by: java.lang.UnsatisfiedLinkError: Could not find jniopencv_core in class, module, and library paths.
        at NativeClassLoader//org.bytedeco.javacpp.Loader.loadLibrary(Loader.java:1767)
        ... 24 common frames omitted

What am I missing?

Thank you!

saudet commented 2 years ago

The versions of JavaCPP and JavaCV need to match. Specifically, 1.5.x isn't compatible with 1.4.x.

nickgaray commented 2 years ago

Forgive the ignorance, what should the version be for compatibility amongst these three:

    embeddedImpl group: 'org.bytedeco', name: 'javacv-platform', version: '1.5.7'
    embeddedImpl 'org.bytedeco:javacpp-presets:1.5.7'
    embeddedImpl group: 'org.bytedeco.javacpp-presets', name: 'opencv', version: '4.0.1-1.4.4'

The process I am writing is attempting to take advantage of CUDA to perform feature detection in a scene

saudet commented 2 years ago

For 1.5.7, a sample list of dependencies is available here: https://github.com/bytedeco/javacpp-presets/tree/1.5.7/opencv#the-pomxml-build-file

nickgaray commented 2 years ago

I changed my dependencies to:

    embeddedImpl group: 'org.bytedeco', name: 'opencv-platform', version: '4.5.5-1.5.7'
    embeddedImpl group: 'org.bytedeco', name: 'opencv-platform-gpu', version: '4.5.5-1.5.7'
    embeddedImpl group: 'org.bytedeco', name: 'cuda-platform-redist', version: '11.6-8.3-1.5.7'

How do I limit the jars pulled in, classifiers for 'linux-arm64' are not valid? So, my dist.zip is greater than 4GB

nickgaray commented 2 years ago

Ok, I was able to limit some dependencies, I am adding this information in hopes it may also help others.

Dependencies for project are now:

dependencies {
    implementation 'org.sensorhub:sensorhub-core:' + oshCoreVersion
    implementation project(':sensorhub-driver-videocam')
    embeddedImpl 'org.jcodec:jcodec-javase:0.1.9'
//    embeddedImpl group: 'org.bytedeco', name: 'opencv-platform', version: '4.5.5-1.5.7'
//    embeddedImpl group: 'org.bytedeco', name: 'cuda-platform-redist', version: '11.6-8.3-1.5.7'

    embeddedImpl group: 'org.bytedeco', name: 'opencv-platform-gpu', version: '4.5.5-1.5.7'
    embeddedImpl group: 'org.bytedeco', name: 'opencv', classifier:'linux-arm64', version: '4.5.5-1.5.7'
    embeddedImpl group: 'org.bytedeco', name: 'cuda', classifier:'linux-arm64', version: '11.6-8.3-1.5.7'
    embeddedImpl group: 'org.bytedeco', name: 'javacpp', classifier:'linux-arm64', version: '1.5.7'

    testImplementation('junit:junit:4.13')
}

I am now getting a different error at runtime, but oddly not at compile time (oddly because the type is resolving at compile):

java.lang.UnsatisfiedLinkError: 'org.bytedeco.opencv.opencv_cudaobjdetect.CudaCascadeClassifier org.bytedeco.opencv.opencv_cudaobjdetect.CudaCascadeClassifier.create(java.lang.String)'

Full error below:

2022-09-01 18:54:04.759 ERROR ModuleRegistry [ModuleRegistry-6] - Cannot start module 'New SensorML Stream Process' [c03c644a-7bcf-44c1-a8c1-834a9b12908a]
org.sensorhub.api.common.SensorHubException: Module must first be initialized
        at NativeClassLoader//org.sensorhub.impl.module.AbstractModule.canStart(AbstractModule.java:473)
        at NativeClassLoader//org.sensorhub.impl.module.AbstractModule.start(AbstractModule.java:486)
        at NativeClassLoader//org.sensorhub.impl.module.ModuleRegistry.lambda$startModuleAsync$1(ModuleRegistry.java:663)
        at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
        at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
        at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
        at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
        at java.base/java.lang.Thread.run(Thread.java:829)
2022-09-01 18:54:07.071 ERROR SMLProcessImpl:d3b84935 [ForkJoinPool.commonPool-worker-3] - Error initializing SML process
java.util.concurrent.CompletionException: java.lang.UnsatisfiedLinkError: 'org.bytedeco.opencv.opencv_cudaobjdetect.CudaCascadeClassifier org.bytedeco.opencv.opencv_cudaobjdetect.CudaCascadeClassifier.create(java.lang.String)'
        at java.base/java.util.concurrent.CompletableFuture.encodeThrowable(CompletableFuture.java:314)
        at java.base/java.util.concurrent.CompletableFuture.completeThrowable(CompletableFuture.java:319)
        at java.base/java.util.concurrent.CompletableFuture$AsyncRun.run(CompletableFuture.java:1739)
        at java.base/java.util.concurrent.CompletableFuture$AsyncRun.exec(CompletableFuture.java:1728)
        at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:290)
        at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1020)
        at java.base/java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1656)
        at java.base/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1594)
        at java.base/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:183)
Caused by: java.lang.UnsatisfiedLinkError: 'org.bytedeco.opencv.opencv_cudaobjdetect.CudaCascadeClassifier org.bytedeco.opencv.opencv_cudaobjdetect.CudaCascadeClassifier.create(java.lang.String)'
        at NativeClassLoader//org.bytedeco.opencv.opencv_cudaobjdetect.CudaCascadeClassifier.create(Native Method)
        at NativeClassLoader//com.botts.process.image.FeatureDetectionProcess.loadClassifiers(FeatureDetectionProcess.java:195)
        at NativeClassLoader//com.botts.process.image.FeatureDetectionProcess.init(FeatureDetectionProcess.java:124)
        at NativeClassLoader//org.vast.process.ExecutableChainImpl.init(ExecutableChainImpl.java:263)
        at NativeClassLoader//org.vast.sensorML.AbstractProcessImpl.init(AbstractProcessImpl.java:223)
        at NativeClassLoader//org.sensorhub.impl.processing.SMLProcessImpl.initChain(SMLProcessImpl.java:125)
        at NativeClassLoader//org.sensorhub.impl.processing.SMLProcessImpl.lambda$doInit$0(SMLProcessImpl.java:107)
        at NativeClassLoader//org.sensorhub.utils.Lambdas.lambda$checked$0(Lambdas.java:66)
        at java.base/java.util.concurrent.CompletableFuture$AsyncRun.run(CompletableFuture.java:1736)
        ... 6 common frames omitted
2022-09-01 18:54:07.073 ERROR ModuleRegistry [ForkJoinPool.commonPool-worker-3] - Error in module 'New SensorML Stream Process' [c03c644a-7bcf-44c1-a8c1-834a9b12908a]
saudet commented 2 years ago

How do I limit the jars pulled in, classifiers for 'linux-arm64' are not valid? So, my dist.zip is greater than 4GB

Please refer to https://github.com/bytedeco/javacpp-presets/wiki/Reducing-the-Number-of-Dependencies

saudet commented 2 years ago

I am now getting a different error at runtime, but oddly not at compile time (oddly because the type is resolving at compile):

If you're trying to use this on linux-arm64, that's not currently available, but contributions are welcome!

nickgaray commented 2 years ago

I am trying to build and deploy on an Nvidia Jetson TX2 dev kit. I have used these libraries before on Windows and Linux and was hoping for a quick win on this device. Sadly, it seems that may not be the case. If time permits, I will look at contributing a solution.

Thank you for your help!

saudet commented 2 years ago

It should be possible to build from source easily though: https://github.com/bytedeco/javacpp-presets#build-instructions If you have any problems specific to the Jetson SDK, @kwatters should be able to help.