郁闷了半天,终于解决了java本地调用c+opencv写的一个小程序。中间遇到了很多麻烦,在这写下来希望能给做相同工作的朋友一点帮助。。。
1 首先编写java代码,确定native函数格式。如下:
public class ImageParseNative{
public int a;
ImageParseNative()
{
a=10;
}
public native void parse(String path, double[] average_img, double[] stdes_img);
static {
System.loadLibrary("ImageParseNative");
}
public static void main(String[] args)
{
ImageParseNative m=new ImageParseNative();
String path="29_3.jpg";
double[] average_img=new double[320];
double[] stdes_img=new double[320];
m.parse(path, average_img, stdes_img);
}
}
parse函数的主要功能是用c+opencv程序实现一个提取图片的特征。
2 接下来是通过javac和javah命令生成ImageParseNative.h文件。注意:此处我写的文件放在了缺省包下,如果有包,在javah时还要对应好包的级别才能顺利生成ImageParseNative.h文件。
生成的ImageParseNative.h文件内容如下:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class ImageParseNative */
#ifndef _Included_ImageParseNative
#define _Included_ImageParseNative
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: ImageParseNative
* Method: parse
* Signature: (Ljava/lang/String;[[D[[D)V
*/
JNIEXPORT void JNICALL Java_ImageParseNative_parse
(JNIEnv *, jclass , jstring, jdoubleArray, jdoubleArray);
#ifdef __cplusplus
}
#endif
#endif
3 用vs2008新建一个dll工程。导入生成的ImageParseNative.h的头文件。然后新建ImageParseNative.cpp文件来实现头文件里的函数。此处我实现函数比较复杂,就不列出内容。写好后,生成dll文件,关键在下列三处:
(1)一定要用Release版来编译生成dll,因为用Debug生成的用java调用时会出现“无法启动应用程序。。。”之类的错误。我就是这里郁闷了好久
(2)选择MT模式运行时库来编译。
(3)opencv的lib库要发布版的,因为此处我们是用Release版来编译的。
这样生成的DLL文件java调用时才不会出错。如果此处不是很明白的,可以加我好友,一起解决。。。
4 把生成的DLL文件和opencv用到的dll文件(cv210.dll cxcore210.dll highgui210.dll)一起拷贝到java工程根目录下。运行java程序,ok,大功告成!!!
结合网上其它资料,以本文为注意点,一定可以完成大家想完成的功能。。。我把我的程序也放在了csdn上,大家可以下载借鉴一下。希望对大家有用。。。