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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/11687.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

服务器3389端口,服务器3389端口风险提示的应对措施

3389端口是Windows操作系统中远程桌面协议&#xff08;RDP&#xff09;的默认端口。一旦该端口被恶意攻击者利用&#xff0c;可能会导致未经授权的远程访问和数据泄露等严重安全问题。 针对此风险&#xff0c;强烈建议您采取以下措施&#xff1a; 1. 修改默认端口&#xff1a;…

springboot3 集成spring-authorization-server (一 基础篇)

官方文档 Spring Authorization Server 环境介绍 java&#xff1a;17 SpringBoot&#xff1a;3.2.0 SpringCloud&#xff1a;2023.0.0 引入maven配置 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter…

识别AI论文生成内容,降低论文高AI率

AI写作工具能帮我们在短时间内高效生成一篇毕业论文、开通报告、文献综述、任务书、调研报告、期刊论文、课程论文等等&#xff0c;导致许多人开始使用AI写作工具作为撰写学术论文的辅助手段。而学术界为了杜绝此行为&#xff0c;开始使用AIGC检测系统来判断文章是由AI生成还是…

解锁商业AI,赋能新质生产力发展——思爱普中国峰会探展全纪录

ITValue 钛媒体独家探秘思爱普中国峰会&#xff0c;带你深刻感受SAP助力企业利用以商业AI为代表的数字化技术&#xff0c;实现质的飞跃&#xff0c;通过全数据、全球化、全绿色赋能新型中国企业发展新质生产力。 首发&#xff5c;钛媒体APP ITValue 5月10日&#xff0c;一年一度…

基于NTP服务器获取网络时间的实现

文章目录 1 NTP1.1 简介1.2 包结构1.3 UNIX 时间戳和NTP时间戳 2 代码实现2.1 实现步骤2.2 完整代码 3 结果 在某些场景下&#xff0c;单片机需要通过网络获取准确的时间进行数据同步&#xff0c;例如日志记录、定时任务等。然而&#xff0c;单片机本身无法直接获得准确的标准时…

Vue的学习 —— <vue指令>

目录 前言 正文 内容渲染指令 内容渲染指令的使用方法 v-text v-html 属性绑定指令 双向数据绑定指令 事件绑定指令 条件渲染指令 循环列表渲染指令 侦听器 前言 在完成Vue开发环境的搭建后&#xff0c;若想将Vue应用于实际项目&#xff0c;首要任务是学习Vue的基…

ORA-00932: inconsistent datatypes: expected - got CLOB的分析解决方案

最近在项目中遇到查询数据时报ORA-00932: inconsistent datatypes: expected - got CLOB错误&#xff0c;这个错误很明显是由于查询时类型的不匹配造成的。 问题分析&#xff1a; 一、检查你的查询的实体的类型是否于数据库的保持一致&#xff0c;如果不一致&#xff0c;那么需…

[力扣题解] 96. 不同的二叉搜索树

题目&#xff1a;96. 不同的二叉搜索树 思路 动态规划 f[i]&#xff1a;有i个结点有多少种二叉搜索树 状态转移方程&#xff1a; 以n3为例&#xff1a; 以1为头节点&#xff0c;左子树有0个结点&#xff0c;右子树有2个结点&#xff1b; 以2为头节点&#xff0c;左子树有1个…

安科瑞AIM-D100-ES光伏储能系统直流绝缘监测仪

概述 AIM-D100-ES 型直流绝缘监测仪主要用于在线监测直流不接地系统正负极对地绝缘电阻&#xff0c;当绝缘电阻低于设定值时&#xff0c;能发出预警和报警信号。 产品可测 100-1500V 的直流系统&#xff0c;可应用于储能直流系统、电动汽车充电装置、UPS 供电系统、光伏直流系…

std::ref和std::cref的使用和原理分析

目录 1.用法 2.std::reference_wrapper介绍 3.std::ref原理分析 4.std::cref原理分析 5.总结 1.用法 它的定义如下&#xff1a; std::ref&#xff1a;用于包装按引用传递的值。 std::cref&#xff1a;用户包装按const引用传递的值。 C本身就有引用&#xff08;&&#…

面试题:调整数字顺序,使奇数位于偶数前面

题目&#xff1a; 输入一个整数数组&#xff0c;实现一个函数&#xff0c;来调整该数组中数字的顺序 使得所有奇数位于数组的前半部分&#xff0c;所有偶数位于数组的后半部分 算法1&#xff1a; 利用快速排序的一次划分思想&#xff0c;从2端往中间遍历 时间复杂度&#x…

C++ | Leetcode C++题解之第88题合并两个有序数组

题目&#xff1a; 题解&#xff1a; class Solution { public:void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {int p1 m - 1, p2 n - 1;int tail m n - 1;int cur;while (p1 > 0 || p2 > 0) {if (p1 -1) {cur nums2[p2-…

Alist + RaiDrive-Nas挂载云盘(Quark)

Alist RaiDrive-Nas挂载云盘(Quark) Alist download Alist document RaiDriver download — https://www.raidrive.com/ nssm download nssm document nssm specification 配置 Alist 下载适合的Alist版本后&#xff0c;启动服务&#xff1b; 需使用命令符。 在完成解…

数字水印 | Python 基于离散小波变换 DWT 的图像水印嵌入(上)

&#x1f34d;原文&#xff1a; 基于 dwt (离散小波变换) 实现彩色图像水印嵌入部分_1.0 &#x1f34d;写在前面&#xff1a; 本文在原文的基础上进行了代码补全。 正文 本文的内容主要为&#xff1a;水印图像经过 A r n o l d \mathsf{Arnold} Arnold 置乱算法后&#xff0…

vue+springboot用户注销功能

vue文件前端 <el-button type"warning" plain click"handleDeletion">注 销</el-button> // 注销 const handleDeletion (userName) > {ElMessageBox.confirm(注销该用户所有信息后无法恢复&#xff0c;您确认注销吗?, 注销确认, { type…

实现日期类

日期类的实现主要是去学习使用operator的 日期类就是计算日期之间的天数&#xff0c;日期与&#xff08;日期&#xff0c;天数&#xff09;的相加减 比如日常生活中我们可以计算日期加天数&#xff0c;日期减天数&#xff0c;日期减日期&#xff0c; 但没有日期加日期的说法 日…

M-有效算法

在赛场上&#xff0c;脑子就两个字“二分”&#xff0c;一点思路都没&#xff0c;完全不知道二分谁&#xff0c;怎么二分&#xff0c;从哪入手。隐隐约约也知道要变换公式&#xff0c;可惜没坚持这个想法。脑子里全是把k分离出来&#xff0c;赛后看了题解才知道&#xff0c;应该…

LeetCode 力扣题目:买卖股票的最佳时机 IV

❤️❤️❤️ 欢迎来到我的博客。希望您能在这里找到既有价值又有趣的内容&#xff0c;和我一起探索、学习和成长。欢迎评论区畅所欲言、享受知识的乐趣&#xff01; 推荐&#xff1a;数据分析螺丝钉的首页 格物致知 终身学习 期待您的关注 导航&#xff1a; LeetCode解锁100…

MQTT学习(二)

订阅主题和订阅确认 SUBSCRIBE——订阅主题 之前的CONNECT报文&#xff0c;分为 固定报头&#xff1a;必须存在&#xff0c;用于描述报文信息。里面有指出什么类型的报文&#xff0c;报文的等级。可变报头&#xff1a;不一定存在。主要看什么样子类型的报文。有效载荷部分&a…

LoRA Land: 310个经微调的大语言模型可媲美GPT-4

摘要 低秩自适应 (LoRA) 已成为大语言模型 (LLM) 参数有效微调 (PEFT) 中最广泛采用的方法之一。LoRA 减少了可训练参数的数量和内存使用,同时达到了与全面微调相当的性能。该研究旨在评估在实际应用中训练和服务使用 LoRA 微调的 LLM 的可行性。首先,该研究测量了在 10 个基础…