1 ,什么是JNI。
JNI是Java Native Interface的缩写,通过使用 Java 本地接口书写程序,可以确保代码在不同的平台上方便移植。
2,编写Java接口。
编写如下测试代码。通过C++编译的DLL计算两个数字相加,得到结果。
package com.opencv.test;
public class JniTest {
public static native int JNI_ADD(int a,int b);
}
先编译以上代码,在生成class的文件夹里执行命令:
【javah -class [项目所在目录] [包名.类名]】 如下:
javah -classpath E:zbxtmytestsrcmainjava com.opencv.test.JniTest
执行完后会在目录下生成一个.h文件[com_opencv_test_JniTest.h]。
4、编写DLL程序。
打开VS新建项目选择Win32项目。
确认后点击下一步应用类型选择DLL。
完成后生成如下项目文件。
复制jdk下的JNI依赖头文件文件[jni.h][jni_md.h]到vs工程目录下。
(注:jni.h在jdk的include目录下,jni_md.h在jdk的includewin32目录下)
在复制编译class生成的[com_opencv_test_JniTest.h]头文件到vs工程目录下,
在VS资源管理器里右键头文件-添加-现有项–找到复制在工程目录下的三个头文件。
打开com_opencv_test_JniTest.h头文件把#include <jni.h>改成#include “jni.h”。
打开项目自动生成的源程序cpp代码[testJavaDll.cpp]引入头文件[com_opencv_test_JniTest.h]。复制[com_opencv_test_JniTest.h]头文件里的java接口生成的[Java_com_opencv_test_JniTest_JNI_1ADD]接口函数,粘贴到项目自动生成的源程序cpp代码[testJavaDll.cpp]中,并在其中修改函数如下图所示。
到这里dll已经写好,接下来点击生成–>生成解决方案,提示以下成功信息就代表dll编译成功。
可以看到dll生成的位置:
5、java调用dll进行测试。
加载DLL方式一:把DLL放在JDK的安装目录的jre/bin目录下如:[c:jdk1.8.0_202jrebin]。
加载DLL方式二:在把DLL放在项目的resources目录下,为了区分新建一个lib目录,如图所示。
在打开Project structure–libraries-点击加号–选择java把resources/lib目录添加进去,
再点击modules勾选lib。
编写以下代码验证DLL。
package com.opencv.test;
public class JniTest {
public static native int JNI_ADD(int a,int b);
static{
System.loadLibrary("testJavaDll");
System.out.println("加载dll成功");
}
public static void main(String[] args) {
int add_result=JNI_ADD(1,2);
System.out.println("计算结果:"+add_result);
}
}