使用visual studio 创建JNI式的动态库及在Java代码中的使用

1.JNI简介

JNI (Java Native Interface) 是 Java 沟通 Native 语言(主要是C、C++)的桥梁。

JNI 数据类型与 JavaC++ 类型对比
在这里插入图片描述

2. 创建java类

使用idea创建一个maven项目,名为jni-demo,并创建一个类JniTest

package com.zhubayi.jnidemo;

/**
 * @author zhubayi
 * @Description
 */
public class JniTest {
    
    
    public native void printExt();
}

整体结构如下:
在这里插入图片描述

3.生成JNI头文件

利用java类生成C头文件,命令如下,注意要在包的根路径执行,也就是src\main\java目录下:

javah -classpath . -jni com.zhubayi.jnidemo.JniTest

在这里插入图片描述

如果文件中有中文,需要指定格式,如格式为UTF-8 需要添加 -encoding UTF-8

参数解析:

  • -classpath [class]指定类的路径
  • -jni [类名] 需要生成的类名称,注意不带java

执行后生成了如下头文件com_zhubayi_jnidemo_JniTest.h

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_zhubayi_jnidemo_JniTest */

#ifndef _Included_com_zhubayi_jnidemo_JniTest
#define _Included_com_zhubayi_jnidemo_JniTest
#ifdef __cplusplus
extern "C" {
    
    
#endif
/*
 * Class:     com_zhubayi_jnidemo_JniTest
 * Method:    printExt
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_com_zhubayi_jnidemo_JniTest_printExt
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

4使用visual studio2022创建DLL项目

4.1 选择模板中(Windows桌面向导)

在这里插入图片描述

如果没有这个模板则安装:
在这里插入图片描述

4.2 为项目命名在这里插入图片描述

4.3 选择应用程序类型为动态链接库

在这里插入图片描述

4.4 项目概览

在这里插入图片描述

5 导入需要的头文件

5.1 导入需要的头文件

将第二步生成的com_zhubayi_jnidemo_JniTest.h文件、JDK目录的include目录下有一个jni.h文件、和JDK目录下的\include\win32下的jni_md.h文件复制到visual studio2022创建的项目中,如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

然后在visual studio2022中点击头文件->添加->现有项,找到上述三个头文件,添加即可。

5.2 修改头文件

找到jni.h文件中#include <jni_md.h>修改为#include "jni_md.h",如下:
在这里插入图片描述
找到com_zhubayi_jnidemo_JniTest.h文件中#include <jni.h>修改为#include "jni.h"",如下:
在这里插入图片描述

6 编写C++实现

在visual studio2022中点击源文件->添加->新建项,选择C++文件,命名为MyJinCpp.cpp,然后在MyJinCpp.cpp编写如下内容:

#pragma execution_character_set("utf-8")//设置字符编码,不然java中显示乱码
#include "com_zhubayi_jnidemo_JniTest.h"
#include <iostream>
using namespace std;//引入命名空间std,使得std::cout和std::endl可以直接省去std::


JNIEXPORT void JNICALL Java_com_zhubayi_jnidemo_JniTest_printExt
(JNIEnv*, jobject) {
    
    
	cout << "现在你正在调用c++的实现" << endl;
}

在这里插入图片描述

7 生成dll文件
在visual studio2022中右键点击生成,输出会显示一个dll的地址,复制这个地址,接下来java要用:
在这里插入图片描述
在这里插入图片描述

8 在java中进行测试

修改Main类,如下:

注意:
使用System.load直接加载任意位置的动态链接库,需要指定全路径以及扩展名
使用System.loadLibrary加载java.library.path这一jvm变量所指向的路径中位置的动态链接库,不需要指定全路径以及扩展名可以通过System.getProperty("java.library.path")方法来获得该变量的值

package com.zhubayi.jnidemo;

/**
 * @author zhubayi
 * @Description
 */
public class Main {
    
    
    static {
    
    
        System.load("D:\\code\\vsProjects\\jniDemo\\x64\\Debug\\jniDemo.dll");
    }

    public static void main(String[] args) {
    
    
        new JniTest().printExt();
    }
}

运行结果:

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_44732146/article/details/146765155