问题描述
我想要创建一个 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>
我遇到了这个异常:
然后我尝试了eclipse,并得到了:
Then I tried eclipse, and got this:
要生成可以正常工作的jar文件,我该怎么做???谢谢!
What I have to do to generate jar file that works fine??? Thanks!!
糟糕:我已经将opencv构建为静态库:
Obs: I have built opencv as static library:
推荐答案
您需要使用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应用程序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!