【问题标题】:Unresolved java.lang.UnsatisfiedLinkError for FaceRecognizer classFaceRecognizer 类的未解决的 java.lang.UnsatisfiedLinkError
【发布时间】:2017-03-29 06:24:15
【问题描述】:

早上好!

我正在使用 java 进行人脸识别项目,但在 FaceRecognizer 类上出现此错误:

Exception in thread "main" java.lang.UnsatisfiedLinkError: com.compa.opencv.nativec.FisherFaceRecognizerID.createFisherFaceRecognizer_1()J
    at com.compa.opencv.nativec.FisherFaceRecognizerID.createFisherFaceRecognizer_1(Native Method)
    at com.compa.opencv.nativec.FisherFaceRecognizerID.<init>(FisherFaceRecognizerID.java:15)
    at com.compa.opencv.PlayMain.createRecognizer(PlayMain.java:128)
    at com.compa.opencv.PlayMain.cameraRecognize(PlayMain.java:88)
    at com.compa.opencv.PlayMain.main(PlayMain.java:33)

我已经尝试了以下链接中的解决方案,但没有奏效:s

Getting 'java.lang.UnsatisfiedLinkError': no lwjgl in java.library.path

Exception in thread "main" java.lang.UnsatisfiedLinkError: no openalprjni in java.library.path

Exception in thread "main" java.lang.UnsatisfiedLinkError"

这是包含错误的代码部分:

package com.compa.opencv.nativec;

import org.opencv.contrib.FaceRecognizer;

public class FisherFaceRecognizerID extends FaceRecognizer{

    private static native long createFisherFaceRecognizer_1();

    private static native long createFisherFaceRecognizer_1(int num_components);

    private static native long createFisherFaceRecognizer_2(int num_components,
            double threshold);

    public FisherFaceRecognizerID() {
        super(createFisherFaceRecognizer_1());
    }

    public FisherFaceRecognizerID(int num_components) {
        super(createFisherFaceRecognizer_1(num_components));
    }

    public FisherFaceRecognizerID(int num_components, double threshold) {
        super(createFisherFaceRecognizer_2(num_components, threshold));
    }

}

完整代码在这里:https://www.dropbox.com/s/pa415f6lz3zbco7/DemoFaceRecognize-master%20%282%29.zip?dl=0

如果能提供任何帮助,我将不胜感激。

【问题讨论】:

    标签: java opencv face-recognition


    【解决方案1】:

    在我看来,您使用的是依赖于原生二进制文件的第三方人脸识别库。

    你必须在你的类路径中添加那些本地二进制文件,例如(在 windows 中是 *.dll 文件,在 unix 或 linux 中是 *.so)

    UnsatisfiedLinkError - 通常表示 Java 本地接口 (JNI) 调用未能找到本地二进制文件。

    这是 eclipse 上的截图,你可以在源代码中看到一个 Native Library,你可以点击 Edit 并选择你的 DLL 或其他文件所在的文件夹。

    【讨论】:

    • 感谢您的回复,我正在使用 Opencv 库中的 dll 文件,并且已将其加载到主文件中,但仍然存在错误。我还使用了上面链接中的建议解决方案 - Djava.library.path 还是没有变化。
    • 我在 Eclipse 上附上了一个屏幕截图,您可以在其中选择与您的源目录关联的本机库的位置。如果您 100% 确定在运行 java 时 DLL 的位置是可见的,但它仍然无法工作,则需要检查系统上这些 DLL 的兼容性,例如32 位 dll 或 64 位 dll。那些用于不同架构的二进制结构可能会成为问题
    • 选择原生库位置(无)并单击编辑以指定存储这些原生库的目录。希望对您有所帮助。
    • 再次感谢您的回复兄弟,我按照您在屏幕截图中建议的步骤编辑了本机库位置以指向dll文件的路径,并为我的系统选择了兼容的--64bit-- 但没有任何变化 :( ......有人建议我,也许 dll 文件无效......你怎么看?
    【解决方案2】:

    这是我找到的临时解决方案:

    在主 java 文件中右键单击 --> 属性 --> 运行/调试设置 --> 选择主 java 文件并单击编辑 --> 参数 --> 在 VM 参数字段中输入以下内容:

    -Djava.library.path="C:\Program Files\Java\opencv2.4.13\build\java\x64; C:\Program Files\Java\opencv2.4.13\build\x64\vc12\bin" 
    

    这将指向 dll 文件的路径,但不幸的是它对我不起作用:(

    大家有什么不同的建议吗?

    【讨论】:

      猜你喜欢
      • 2011-03-16
      • 2019-07-21
      • 2021-11-09
      • 2019-09-23
      • 1970-01-01
      • 2019-10-07
      • 2018-03-06
      • 2021-06-29
      • 2017-05-27
      相关资源
      最近更新 更多