最近项目中混合编程,算法程序使用C/C++编写,而算法服务器是Java开发的。为便于开发整合,于是决定使用Java JNI来实现C/C++算法部分代码的调用。于是也就有了这篇文章。本文以Windows系统上使用Java JNI混合编程为例,Linux系统上同理(Linux系统上的动态链接库为.so后缀结尾)。
本文目录
1、创建Java工程
1.1 新建Java工程
使用IDEA新建Java演示工程,过程如下:
(1)新建Java工程:
(2)直接跳过,next:
(3)填写文件名和文件路径,Finish,创建完成。
(4)工程新建完成如下:
1.2 编写对应C/C++程序的Java对象类
(1)在src文件夹下创建jni包,新建类Demo.class,内容如下:
package jni;
public class Demo {
public native void sayHello(int x,int y);
}
(2)在终端Terminal中生成class类文件:
先进入到当前demo.java类所在文件夹下,使用以下命令生成class文件:
javac Demo.java
生成文件如下:
(3)使用javah生成h文件:
需要注意的是:在JDK10之后,javah命令已被移除,如果需要使用javah命令,可通过javac -h来实现。
这里命令如下:
javac -h ./ Demo.java
这是可以看到生成的h头文件如下:
h文件中内容如下:该文件自动生成,作文C++文件和Java文件的关联。编译制作dll动态链接库需要用到,请勿修改。
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class jni_Demo */
#ifndef _Included_jni_Demo
#define _Included_jni_Demo
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: jni_Demo
* Method: sayHello
* Signature: (II)V
*/
JNIEXPORT void JNICALL Java_jni_Demo_sayHello
(JNIEnv *, jobject, jint, jint);
#ifdef __cplusplus
}
#endif
#endif
至此,Java对应的接口方面内容完成。
2、编译制作dll动态库
下面以VS来演示生成dll动态链接库文件。
2.1 创建dll工程
(1)打开VS,新建项目:如下:选择Win32项目:
(2)选择DLL和空项目,如下:
(3)新建完成。
2.2 编写C/C++源文件
(1)将上述1中生成的jni_Demo.h文件复制过来并添加进来,如下:
(2)编写接口实现cpp文件:创建demo.cpp文件:并编写代码实现:
(3)配置包含目录
在项目属性-包含目录中,添加Java JDK include文件,如下所示:
上面包含目录,需要修改为电脑上JDK安装路径中的include文件路径。
(4)(非必选)配置dll对应的系统版本
需要注意的是,生成的dll动态链接库,需要和系统位数对应,VS默认是32位的,如果服务器是64位的,需要手动修改平台再生成。
如下图所示,可以在配置管理器中,新建解决方案平台为X64的:
2.3 生成DLL动态链接库文件
点击生成,即可在Debug/Release中生成dll文件。示例如下:
3、Java程序调用
3.1 程序入口:
(1)新建程序入口类Mian类,并在其中编写调用C++代码的代码,程序示例如下:
public class Main {
public static void main(String[] args){
System.load("F:\\StethoscopeProject\\JniDemo\\src\\native\\Win32Project2.dll");
Demo demo = new Demo();
demo.sayHello(2,3);
}
}
这里首先加载了dll动态链接库,后续通过调用demo对象的方法,即实现了C++代码的调用。
(2)将前述2生成的dll动态链接库文件放到程序的某路径下,并修改load()中的文件路径为实际路径。如下:
3.2 实验结果
启动程序,即可看到结果:这里输出为:
可以看到,程序加载了C++的dll动态链接库,Java应用可以正常调用C++实现。
至此2,实验结束。
欢迎交流!