构建使用OpenCV Portable的Java应用程序 [英] Build java application that uses opencv portable

查看:41
本文介绍了构建使用OpenCV Portable的Java应用程序的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想要创建一个 opencv 嵌入在程序包中的可执行.jar文件.我的意思是我可以在另一台计算机上运行它.拜托,有人帮我吗???

I want to create executable .jar file that opencv is embedded in the package. I mean that I can run it on another computer. Please, someone helps me???

我在文件 SimpleSample.java 中有此代码:

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.CvType;
import org.opencv.core.Scalar;

class SimpleSample {

  static{ System.loadLibrary(Core.NATIVE_LIBRARY_NAME); }

  public static void main(String[] args) {
    System.out.println("Welcome to OpenCV " + Core.VERSION);
    Mat m = new Mat(5, 10, CvType.CV_8UC1, new Scalar(0));
    System.out.println("OpenCV Mat: " + m);
    Mat mr1 = m.row(1);
    mr1.setTo(new Scalar(1));
    Mat mc5 = m.col(5);
    mc5.setTo(new Scalar(5));
    System.out.println("OpenCV Mat data:\n" + m.dump());
  }
}

我尝试在用Ant构建后运行它, build.xml :

I try to run it after building with Ant, build.xml:

<project name="SimpleSample" basedir="." default="rebuild-run">
    <property name="src.dir"     value="src"/>
    <property name="lib.dir"     value="${ocvJarDir}"/>
    <path id="classpath"><fileset dir="${lib.dir}" includes="**/*.jar"/></path>
    <property name="build.dir"   value="build"/>
    <property name="classes.dir" value="${build.dir}/classes"/>
    <property name="jar.dir"     value="${build.dir}/jar"/>
    <property name="main-class"  value="${ant.project.name}"/>
    <target name="clean"><delete dir="${build.dir}"/></target>
    <target name="compile">
        <mkdir dir="${classes.dir}"/>
        <javac includeantruntime="false" srcdir="${src.dir}" destdir="${classes.dir}" classpathref="classpath"/>
    </target>
    <target name="jar" depends="compile">
        <mkdir dir="${jar.dir}"/>
        <jar destfile="${jar.dir}/${ant.project.name}.jar" basedir="${classes.dir}">
            <manifest>
                <attribute name="Main-Class" value="${main-class}"/>
            </manifest>
        </jar>
    </target>
    <target name="run" depends="jar">
        <java fork="true" classname="${main-class}">
            <sysproperty key="java.library.path" path="${ocvLibDir}"/>
            <classpath>
                <path refid="classpath"/>
                <path location="${jar.dir}/${ant.project.name}.jar"/>
            </classpath>
        </java>
    </target>
    <target name="rebuild" depends="clean,jar"/>
    <target name="rebuild-run" depends="clean,run"/>
</project>

我遇到了这个异常:

线程主"中的异常java.lang.NoClassDefFoundError:SimpleSample处的org/opencv/core/Core.(未知源)创建人:java.lang.ClassNotFoundException:org.opencv.core.Core位于java.net.URLClassLoader.findClass(URLClassLoader.java:381)在java.lang.ClassLoader.loadClass(ClassLoader.java:424)在sun.misc.Launcher $ AppClassLoader.loadClass(Launcher.java:331)在java.lang.ClassLoader.loadClass(ClassLoader.java:357)...还有1个

Exception in thread "main" java.lang.NoClassDefFoundError: org/opencv/core/Core at SimpleSample.(Unknown Source) Caused by: java.lang.ClassNotFoundException: org.opencv.core.Core at java.net.URLClassLoader.findClass(URLClassLoader.java:381) at java.lang.ClassLoader.loadClass(ClassLoader.java:424) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331) at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ... 1 more

然后我尝试了eclipse,并得到了:

Then I tried eclipse, and got this:

线程主"中的异常java.lang.UnsatisfiedLinkError:否java.library.path中的opencv_java300java.lang.ClassLoader.loadLibrary(ClassLoader.java:1864)在java.lang.Runtime.loadLibrary0(Runtime.java:870)在java.lang.System.loadLibrary(System.java:1122)在在java.lang.Class.forName0(Native)上进行test.Test.(Test.java:10)方法),位于java.lang.Class.forName(Class.java:348)org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:56)

Exception in thread "main" java.lang.UnsatisfiedLinkError: no opencv_java300 in java.library.path at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1864) at java.lang.Runtime.loadLibrary0(Runtime.java:870) at java.lang.System.loadLibrary(System.java:1122) at test.Test.(Test.java:10) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:348) at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:56)

要生成可以正常工作的jar文件,我该怎么做???谢谢!

What I have to do to generate jar file that works fine??? Thanks!!

糟糕:我已经将opencv构建为静态库:

Obs: I have built opencv as static library:

cmake -DBUILD_SHARED_LIBS = OFF ..

cmake -DBUILD_SHARED_LIBS=OFF ..

推荐答案

您需要使用jar文件打包静态库,将该静态库加载到临时文件,然后从该路径加载静态库.

You need to package static library with jar file, load that static library to a temperory file, and load you static library from that path.

在名为opencv的资源中创建一个文件夹,并将 .dll .dylib 文件放置在相应的文件夹中.

Make a folder in resources named opencv and place .dll or .dylib files in respective folders.

public class LoadLibrary {
public static void loadOpenCV() {
    try {
        InputStream inputStream = null;
        File fileOut = null;
        String osName = System.getProperty("os.name");
        System.out.println(osName);

        if (osName.startsWith("Windows")) {
            int bitness = Integer.parseInt(System.getProperty("sun.arch.data.model"));
            if (bitness == 32) {
                inputStream = LoadLibrary.class.getResourceAsStream("/opencv/windows/x86/opencv_java300.dll");
                fileOut = File.createTempFile("lib", ".dll");
            } else if (bitness == 64) {
                inputStream = LoadLibrary.class.getResourceAsStream("/opencv/windows/x64/opencv_java300.dll");
                fileOut = File.createTempFile("lib", ".dll");
            } else {
                inputStream = LoadLibrary.class.getResourceAsStream("/opencv/windows/x86/opencv_java300.dll");
                fileOut = File.createTempFile("lib", ".dll");
            }
        } else if (osName.equals("Mac OS X")) {
            inputStream = LoadLibrary.class.getResourceAsStream("/opencv/mac/libopencv_java300.dylib");
            fileOut = File.createTempFile("lib", ".dylib");
        }

        if (fileOut != null) {
            OutputStream outputStream = new FileOutputStream(fileOut);
            byte[] buffer = new byte[1024];
            int length;

            while ((length = inputStream.read(buffer)) > 0) {
                outputStream.write(buffer, 0, length);
            }

            inputStream.close();
            outputStream.close();
            System.load(fileOut.toString());
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

}

更改静态{System.loadLibrary(Core.NATIVE_LIBRARY_NAME);} 到Main中的 LoadLibrary.loadOpenCV(); 或在调用OpenCV函数之前.

Change Static { System.loadLibrary(Core.NATIVE_LIBRARY_NAME); } to LoadLibrary.loadOpenCV(); in Main or before calling OpenCV functions.

并尝试从Eclipse导出jar文件.它将正常工作.

And try to export your jar file from Eclipse. It will work just fine.

这篇关于构建使用OpenCV Portable的Java应用程序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆