visual studio2022 JNI极简开发流程

2024-05-14 07:44

本文主要是介绍visual studio2022 JNI极简开发流程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 1 创建java类
  • 2 生成JNI头文件
  • 3 使用visual studio2022创建DLL项目
    • 3.1 选择模板中(Windows桌面向导)
    • 3.2 为项目命名
    • 3.3 选择应用程序类型为动态链接库
    • 3.4 项目概览
  • 4 导入需要的头文件
    • 4.1 导入需要的头文件
    • 4.2 修改头文件
  • 5 编写C++实现
  • 6 生成dll文件
  • 7 在java中进行测试

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

这篇关于visual studio2022 JNI极简开发流程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/988166

相关文章

使用Python开发一个带EPUB转换功能的Markdown编辑器

《使用Python开发一个带EPUB转换功能的Markdown编辑器》Markdown因其简单易用和强大的格式支持,成为了写作者、开发者及内容创作者的首选格式,本文将通过Python开发一个Markd... 目录应用概览代码结构与核心组件1. 初始化与布局 (__init__)2. 工具栏 (setup_t

Spring Shell 命令行实现交互式Shell应用开发

《SpringShell命令行实现交互式Shell应用开发》本文主要介绍了SpringShell命令行实现交互式Shell应用开发,能够帮助开发者快速构建功能丰富的命令行应用程序,具有一定的参考价... 目录引言一、Spring Shell概述二、创建命令类三、命令参数处理四、命令分组与帮助系统五、自定义S

Python通过模块化开发优化代码的技巧分享

《Python通过模块化开发优化代码的技巧分享》模块化开发就是把代码拆成一个个“零件”,该封装封装,该拆分拆分,下面小编就来和大家简单聊聊python如何用模块化开发进行代码优化吧... 目录什么是模块化开发如何拆分代码改进版:拆分成模块让模块更强大:使用 __init__.py你一定会遇到的问题模www.

Spring Security基于数据库的ABAC属性权限模型实战开发教程

《SpringSecurity基于数据库的ABAC属性权限模型实战开发教程》:本文主要介绍SpringSecurity基于数据库的ABAC属性权限模型实战开发教程,本文给大家介绍的非常详细,对大... 目录1. 前言2. 权限决策依据RBACABAC综合对比3. 数据库表结构说明4. 实战开始5. MyBA

使用Python开发一个简单的本地图片服务器

《使用Python开发一个简单的本地图片服务器》本文介绍了如何结合wxPython构建的图形用户界面GUI和Python内建的Web服务器功能,在本地网络中搭建一个私人的,即开即用的网页相册,文中的示... 目录项目目标核心技术栈代码深度解析完整代码工作流程主要功能与优势潜在改进与思考运行结果总结你是否曾经

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis

Python基于wxPython和FFmpeg开发一个视频标签工具

《Python基于wxPython和FFmpeg开发一个视频标签工具》在当今数字媒体时代,视频内容的管理和标记变得越来越重要,无论是研究人员需要对实验视频进行时间点标记,还是个人用户希望对家庭视频进行... 目录引言1. 应用概述2. 技术栈分析2.1 核心库和模块2.2 wxpython作为GUI选择的优

利用Python开发Markdown表格结构转换为Excel工具

《利用Python开发Markdown表格结构转换为Excel工具》在数据管理和文档编写过程中,我们经常使用Markdown来记录表格数据,但它没有Excel使用方便,所以本文将使用Python编写一... 目录1.完整代码2. 项目概述3. 代码解析3.1 依赖库3.2 GUI 设计3.3 解析 Mark

利用Go语言开发文件操作工具轻松处理所有文件

《利用Go语言开发文件操作工具轻松处理所有文件》在后端开发中,文件操作是一个非常常见但又容易出错的场景,本文小编要向大家介绍一个强大的Go语言文件操作工具库,它能帮你轻松处理各种文件操作场景... 目录为什么需要这个工具?核心功能详解1. 文件/目录存javascript在性检查2. 批量创建目录3. 文件

Spring AI ectorStore的使用流程

《SpringAIectorStore的使用流程》SpringAI中的VectorStore是一种用于存储和检索高维向量数据的数据库或存储解决方案,它在AI应用中发挥着至关重要的作用,本文给大家介... 目录一、VectorStore的基本概念二、VectorStore的核心接口三、VectorStore的