Opencv 动态库引用报错 Can't load this .dll (machine code=0xbd) on a AMD 64-bit platform

背景:

最近在做人脸识别的项目中,集成了opencv,在集成过程中,出现问题,但单独的j2se的demo中是可以正常调用和使用opencv的人脸识别功能。但是当迁移到javaweb中时,就会报错:Can't load this .dll (machine code=0xbd) on a AMD 64-bit platform

源码:

package com.xxx.servicer.camare.core;

import java.io.File;

import org.opencv.core.Mat;
import org.opencv.core.MatOfRect;
import org.opencv.highgui.Highgui;
import org.opencv.objdetect.CascadeClassifier;

import com.xxx.api.util.ToolsUtil;

/**
 * opencv的人脸检测和眼睛检测方法
 * @author xxxxx
 *
 */
public class OpenCVMaster {
    private static final OpenCVMaster instence = new OpenCVMaster();
    private static String haarcascade_frontalface_alt_path = "";
    private static String haarcascade_eye_tree_eyeglasses_path = "";
    CascadeClassifier eyeDetector2 = null;
    // 从配置文件lbpcascade_frontalface.xml中创建一个人脸识别器,该文件位于opencv安装目录中
    CascadeClassifier faceDetector = null;
    private OpenCVMaster() {
        // 导入opencv的库
        String string = new String("opencv\\x64");
        String relativePath = string.replace("\\", String.valueOf(File.separatorChar));
        String opencvpath = ToolsUtil.getRealPath(relativePath);
        String opencv_java2410_path = opencvpath + "opencv_java2410.dll";
        System.load(opencv_java2410_path);

        //创建人脸和人眼识别器
        haarcascade_frontalface_alt_path = opencvpath + "haarcascade_frontalface_alt.xml";
        haarcascade_eye_tree_eyeglasses_path = opencvpath + "haarcascade_eye_tree_eyeglasses.xml";
        eyeDetector2 = new CascadeClassifier(haarcascade_eye_tree_eyeglasses_path);
        // 从配置文件lbpcascade_frontalface.xml中创建一个人脸识别器,该文件位于opencv安装目录中
        faceDetector = new CascadeClassifier(haarcascade_frontalface_alt_path);
    }
    public static OpenCVMaster instence() {
        return instence;
    }

}
/**
 * 工具类
 * @author lyj 2015年12月11日
 *
 */
public class ToolsUtil {   

/**
     * 获取relativePath的真实路径
     * @param relativePath 项目根目录下的WEB-INF\classes的相对路径
     * @return
     */
    public static String getRealPath(String relativePath) {

        String path = new ToolsUtil().getClass().getClassLoader().getResource("").getPath();
        
        return path+File.separatorChar+relativePath+File.separatorChar;
    }

}

报错:

当执行到

System.load(opencv_java2410_path);

此时会弹出报错:

 Can't load this .dll (machine code=0xbd) on a AMD 64-bit platform

排错:

1、确定.dll文件是否为X64位的版本;

2、查看可行的单独demo中.dll的具体路径(本人是使用确定地址后解决了问题);

3、排查jdk,tomcat等容器及支持编译器及系统的64位支持情况;

原因分析:

从getRealPath方法可以看到,代码是获取的编译后的文件路径,在对比了两个dll文件的大小后,确认编译后的项目路径中的dll被篡改了(此处尚有疑问,作为项目中的资源文件,怎么会需要编译这些文件呢?),文件大小也不相同。

最终使用原文件的具体路径直接初始化,即将服务器上的文件详细路径作为加载的路径。问题得到解决。

 

你可能感兴趣的:(jni,opencv)