java.lang.UnsatisfiedLinkError : org. opencv.core.Mat.n_Mat(IIILjava/nio/ByteBuffer;)J

标签 java opencv kotlin gradle javacv

这个问题在这里已经有了答案:





java.lang.UnsatisfiedLinkError: org.opencv.core.Mat.n_Mat(III)J?

(3 个回答)


1年前关闭。




我正在使用 JavaFX 和 JavaCV 进行项目。我在应用程序中的主要功能是基于网络摄像头捕获。我正在寻找一种将框架从 OpenCVFrameGrabber 显示到 JavaFX 组件中的方法。
我找到了一种方法,但出现以下错误:

Exception in thread "main" java.lang.UnsatisfiedLinkError: org.opencv.core.Mat.n_Mat(IIILjava/nio/ByteBuffer;)J
    at org.opencv.core.Mat.n_Mat(Native Method)
    at org.opencv.core.Mat.<init>(Mat.java:52)
    at org.bytedeco.javacv.OpenCVFrameConverter.convertToOrgOpenCvCoreMat(OpenCVFrameConverter.java:187)
    at org.bytedeco.javacv.OpenCVFrameConverter$ToOrgOpenCvCoreMat.convert(OpenCVFrameConverter.java:61)
    at TestJavaCV$Companion.main(TestJavaCV.kt:20)
    at TestJavaCV.main(TestJavaCV.kt)
我怀疑应用程序由于不依赖失败而无法工作。可能我应该为 提供额外的库org.opencv.core 但我不知道如何在 gradle 中实现这一点。
最小的、可重复的示例:
build.gradle
dependencies {
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8"
    testCompile group: 'junit', name: 'junit', version: '4.12'
    compile group: 'org.bytedeco', name: 'javacv-platform', version: '1.5.3'
}
TestJavaCV.kt
import javafx.scene.image.Image
import org.bytedeco.javacv.Frame
import org.bytedeco.javacv.OpenCVFrameConverter
import org.bytedeco.javacv.OpenCVFrameGrabber
import org.opencv.core.Mat
import org.opencv.core.MatOfByte
import org.opencv.imgcodecs.Imgcodecs
import java.io.ByteArrayInputStream

class TestJavaCV {
    companion object {
        private val toOrgOpenCvCoreMat = OpenCVFrameConverter.ToOrgOpenCvCoreMat()

        @JvmStatic
        fun main(args: Array<String>) {
            val grabber: OpenCVFrameGrabber = OpenCVFrameGrabber(0);
            grabber.start()

            val frame: Frame = grabber.grabFrame()
            val mat: Mat = toOrgOpenCvCoreMat.convert(frame)
            val matOfByte: MatOfByte = MatOfByte()

            Imgcodecs.imencode(".png", mat, matOfByte)
            val image = Image(ByteArrayInputStream(matOfByte.toArray()))
        }
    }
}

最佳答案

这个问题java.lang.UnsatisfiedLinkError: org.opencv.core.Mat.n_Mat(III)J?回答为什么你会得到 UnsatisfiedLinkError ;您的 Java VM 未加载 OpenCV 的库,因此无法进行相关的 native 调用。
这个问题How to use opencv in using Gradle?应该可以帮助您使用 Gradle 配置 OpenCV。
根据您的评论问题“我要求该应用程序在 Windows 10、Linux 和 MacOS 上运行。”我不知道如何使用 gradle 来解决这个问题,但是在 Java 中,我会为每个操作系统注入(inject)一个不同的系统属性,并在你的类的静态 block 中使用它来加载你的库:

static {

    String libraryPath = System.getProperty("opencv.path");

    System.load(libraryPath);

}

关于java.lang.UnsatisfiedLinkError : org. opencv.core.Mat.n_Mat(IIILjava/nio/ByteBuffer;)J,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63056169/

相关文章:

c++ - openCV 2.3.1 findContours函数链接错误

kotlin - 在Kotlin中使用Coroutine时如何保证获取最新数据?

Android 工具栏菜单项从不显示,但会溢出

java - 如何在 httpclient 4.3+ 中更新 HttpClient 的设置?

java - 带参数的 DRY 自定义 Guice 提供程序

java - 如何同时运行两个 FOR 循环

java - Java 应用程序可以在 Android 2.2 设备上使用 USB Host 吗?

python - OpenCV 背景减除以改进检测

c++ - C++ Cmake的OpenCV

java - 在 Java : Cannot find symbol 中使用 Kotlin 类