visual studio2022 JNI极简开发流程

1 创建java类

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

package com.example;

public class JniTest {

    public native void printExt();
    
}

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

2 生成JNI头文件

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

javah -classpath . -jni com.example.JniTest
  • 如果文件中有中文,需要指定格式,如格式为UTF-8 需要添加 -encoding UTF-8

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

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

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

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

#ifdef __cplusplus
}
#endif
#endif

3 使用visual studio2022创建DLL项目

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

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

3.2 为项目命名

在这里插入图片描述

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

在这里插入图片描述

3.4 项目概览

在这里插入图片描述

4 导入需要的头文件

4.1 导入需要的头文件

将第二步生成的com_example_JniTest.h文件、JDK目录的include目录下有一个jni.h文件、和JDK目录下的\include\win32下的jni_md.h文件复制到visual studio2022创建的项目中,如下:
在这里插入图片描述
然后在visual studio2022中点击头文件->添加->现有项,找到上述三个头文件,添加即可。

4.2 修改头文件

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

5 编写C++实现

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

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


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

6 生成dll文件

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

7 在java中进行测试

修改Main类,如下:

注意:

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

// Press Shift twice to open the Search Everywhere dialog and type `show whitespaces`,
// then press Enter. You can now see whitespace characters in your code.
public class Main {

    static {
        System.load("D:\\ItemProjects\\cpp\\JniProject\\x64\\Debug\\JniProject.dll");
    }

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

运行结果:

现在你正在调用c++的实现

Process finished with exit code 0

相关推荐

  1. linux深度学习开发基础命令——

    2024-05-14 08:08:02       58 阅读
  2. 001-Windows下PyTorch开发环境配置(上)

    2024-05-14 08:08:02       44 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-05-14 08:08:02       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-05-14 08:08:02       106 阅读
  3. 在Django里面运行非项目文件

    2024-05-14 08:08:02       87 阅读
  4. Python语言-面向对象

    2024-05-14 08:08:02       96 阅读

热门阅读

  1. MySQL和MongoDB区别

    2024-05-14 08:08:02       36 阅读
  2. k8s 配置管理

    2024-05-14 08:08:02       53 阅读
  3. Redis 5.0 Stream数据结构深入分析

    2024-05-14 08:08:02       32 阅读
  4. 力扣:93. 复原 IP 地址

    2024-05-14 08:08:02       35 阅读
  5. 数据库和Redis数据不一致的问题

    2024-05-14 08:08:02       33 阅读
  6. Rust 语言不支持 goto 语句

    2024-05-14 08:08:02       35 阅读
  7. ubuntu 24.04 devilspie 报错解决

    2024-05-14 08:08:02       40 阅读
  8. CircleCI的原理及应用详解(二)

    2024-05-14 08:08:02       29 阅读
  9. 10、Go Gin 连接Redis以及Cookie&Session

    2024-05-14 08:08:02       33 阅读
  10. 使用frp通过http访问内网web服务

    2024-05-14 08:08:02       35 阅读
  11. Nginx-01-Nginx 是什么? 能做什么?

    2024-05-14 08:08:02       28 阅读
  12. hdfs中的小知识(hadoop hdfs hive)

    2024-05-14 08:08:02       37 阅读
  13. springboot 注解(持续更新中)

    2024-05-14 08:08:02       38 阅读