(混合编程)Java JNI调用C/C++代码编程,看这篇就够了!

最近项目中混合编程,算法程序使用C/C++编写,而算法服务器是Java开发的。为便于开发整合,于是决定使用Java JNI来实现C/C++算法部分代码的调用。于是也就有了这篇文章。本文以Windows系统上使用Java JNI混合编程为例,Linux系统上同理(Linux系统上的动态链接库为.so后缀结尾)。

本文目录

1、创建Java工程

1.1 新建Java工程

1.2 编写对应C/C++程序的Java对象类

2、编译制作dll动态库

2.1 创建dll工程

2.2 编写C/C++源文件

2.3 生成DLL动态链接库文件

3、Java程序调用

3.1 程序入口:

3.2 实验结果


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,实验结束。

 

欢迎交流!

 

 

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值