JNI学习笔记

来源:互联网 发布:淘宝达人挣钱吗 编辑:程序博客网 时间:2024/05/03 21:31

学习JNI的初衷是实验室需要一个项目,就是将自主检索到的图片做一个分类...具体的分类还没讨论定。


于是自己先摸索着。需要学习的东西略多,首先是opencv,然后在java程序中调用用到opencv库的C++程序。


所以就得用到JNI技术。话说不得不吐槽,在Eclipse底下配置C/C++的开发真心十足蛋疼。


流程是 C/C++[opencv库]  => (生成) dll文件 => java程序通过JNI调用dll文件....


===================================================================================================================================



JNI以及java使用opencv环境搭建

本文主要描述,通过将opencv的c或者c++代码打包成dll文件,进而通过JNI调用。

工具:

1.     Eclipse( jdk1.7以上)

2.     CDTplugin(for c++ development in eclipse)                        

http://www.eclipse.org/cdt/downloads.php

3.     MINGW

  32位 http://www.mingw.org/

       64位 http://mingw-w64-dgn.googlecode.com/files/mingw-w64-bin-x86_64-20111106.7z

安装完成后

4.      下载gdb-6.6.tar.bz2

(1)    下载地址:http://downloads.sourceforge.net/mingw/gdb-6.6.tar.bz2

(2)    解压后,里面有这几个目录

全选复制到MinGW目录下,选择全部覆盖。

5.      MSYS (可以不用)

http://downloads.sourceforge.net/mingw/MSYS-1.0.10.exe 

6.      配置环境变量,将MINGW的bin目录加到系统path中.

进入D:/MinGW/bin目录,找到mingw32-make.exe文件,复制一个副本,改名为 make.exe

因为CDT默认的是make命令,当然也可以更改CDT的默认设置

7.      完成.

 

 

 

一、       首先在eclipse中创建一个空的Java Project为了能够在java工程中使用opencv. 

 

1.      将opencv\build\java目录中的jar包导入到工程路径

2.      加入opencv\build\java\x64(x86)\libopencv_java244.dll,这是上面jar包native library.

可以将此dll文件直接加到jar的native library下,更简便的方法是直接将dll文件拷贝到工程根目录下即可.

此时工程目录像下图所示:

 

 

好了 测试一下:

 

 

 

 

 

 

 

二、       G++编译dll文件

将java工程convert to c++ project,将opencv的include头文件夹加到c++ path,并且将jni.h所在路径即为jdk1.7.0_07\include加入(记得将include/win32下的jawt_md.h以及jni_md.h复制到include文件夹下)。

 

1.      好了,我们开始编写C++代码。

在工程中创建一个文件夹,比如叫jni,里面用于统一存放C++源代码。

在jni下新建一个.cpp文件(matchPic.cpp),这里的cpp文件写法必须是符合JNI调用规范,具体请查资料,例子如下:

#include <iostream>

#include <jni.h>

using namespace std;

#ifdef __cplusplus

extern "C" {

#endif

 

JNIEXPORT void JNICALLJava_com_santi_search_Test_printHello(JNIEnv * jenv,

      jobject obj) {

 

   cout << "Hello Jni World!" << endl;

   return;

 

}

 

#ifdef __cplusplus

}

#endif

 

在cmd中编译matchPic.cpp文件生成.dll文件:

E:\Computer_Language\Java\workspaces\abc\jni>

g++ -shared -o matchPic.dll matchPic.cpp

-I "C:\Program Files\Java\jdk1.7.0_07\include"

生成matchPic.dll文件,将dll文件拷到工程根目录下,即可通过System.loadLibrary()调用。

 

 

2.      好了,我们现在在c++源代码matchPic.cpp中加入OPENCV的一些方法,新建一个toGray函数

#include <iostream>

#include <jni.h>

#include <opencv/cv.h>

#include <opencv2/imgproc/imgproc.hpp>

#include <opencv2/highgui/highgui.hpp>

 

using namespace std;

using namespace cv;

#ifdef __cplusplus

extern "C" {

#endif

 

JNIEXPORT void JNICALLJava_com_santi_search_Test_printHello(JNIEnv * jenv,

      jobject obj) {

 

   cout << "Hello Jni World!" <<endl;

   return;

 

}

 

JNIEXPORT void JNICALLJava_com_santi_search_Test_toGray(JNIEnv * jenv,

      jobject obj, jlong colorAddr, jlong grayAddr) {

   Mat* mat_color = (Mat *)colorAddr;

   Mat* mat_gray = (Mat *) grayAddr;

 

   cvtColor(*mat_color, *mat_gray,CV_RGB2GRAY);

   namedWindow("lena",CV_WINDOW_AUTOSIZE);

   imshow("lena", *mat_gray);

   cvWaitKey(0);

   cout << "to gray" << endl;

   return ;

}

 

#ifdef __cplusplus

}

#endif

 

int main(){

   return 0;

}

 

 

 

为了让以上代码能够编译通过,必须导入所有用到的opencv的dll文件.

 

好了路径设置完毕

在cmd中重新编译matchPic.cpp

E:\Computer_Language\Java\workspaces\abc\jni>

g++  -shared  -o matchPic.dll matchPic.cpp

"-IC:\Program Files\Java\jdk1.7.0_07\include" "-IE:\Computer_Language\Java

\opencv\build\include"

 -L "E:\Computer_Language\Java\opencv\build\x64\mingw\bin"

   -lopencv_core244 -lopencv_imgproc244 -lopencv_highgui244 -lopencv_calib3d244

以上命令生成matchPic.dll文件

g++ 简要参数说明:

 -I 表示cpp中用到的头文件的路径,这里用到了jni.h以及cv.h

-L 表示用到的lib的路径

-l  具体的lib名称.

 

好了,将生成的 matchPic.dll复制到工程根目录,在java中调用测试一下:

 

 

好了,运行一下就会弹出一张灰色的lena照片,搞定.

 

可能会遇到的问题:

1. Jdk的位数32(64)必须和dll位数一致才可以,如果你用的是32位jdk,请用g++编译32的dll,反之亦然.

2. 经本人测试,生成的.dll文件,如果不包含opencv类库可以随便的移动到MyEclipse中调用。但是如果.dll中用到了opencv,请务必将opencv对应的.dll库文件一并复制到工程主目录下,否则在MyEclipse中会出现 can’t find dependent libraries.

3. 如果在运行opencv的c++程序时候,程序一闪而过,想显示图片也没有显示,console也没有任何输出.这是因为运行时java没有找到opencv的lib库。

只需将其加入到系统path变量中,比如:

 

E:\Computer_Language\Java\opencv\build\x64\mingw\bin;

 

 

参考资料:

http://blog.csdn.net/fandyvon/article/details/6280369

http://stackoverflow.com/

 

g++编译选项

jni的使用

opencv文档



==============================================================================================


真心配置的好麻烦...但接下来,就可以轻松愉快的开始写C++程序,编译成dll文件,再写个java文件调用了唔..........



Best Wishes for you!