Java通过JNI调用dll动态库详细步骤

news2024/12/31 3:42:08

目录

  • 目标
  • 具体示例
    • 1、编写java代码:定义native接口
    • 2、根据java编写的native接口生成.h头文件
    • 3、使用Visual Studio编写c++代码实现头文件接口并生成dll文件
    • 4、将生成的jni.dll文件放入jdk bin下
    • 5、编写java测试类,调用dll
  • 附:问题
    • java测试类执行出现报错:java.lang.UnsatisfiedLinkError: xx\jni.dll: Can't find dependent libraries

目标

JNI是Java Native Interface的缩写,通过使用JNI规范可以与其它语言程序进行交互,可以确保代码在不同的平台上方便移植。本文目标:编写一个小示例来说明Java如何调用dll动态库,打印出dll中返回的字符串。

具体示例

1、编写java代码:定义native接口

package com.test;
public class ZDll {
    public native String ZxRgetenv(String key);
}

2、根据java编写的native接口生成.h头文件

打开cmd命令容器,键入以下命令,生成native接口h头文件:

C:\Users\chang\Desktop>javah -classpath D:\project\testProjects\src\main\java  -jni com.test.ZDll

其中classpath后的路径为com.test.ZDll类所在目录,执行命令会在C:\Users\chang\Desktop下生成名为com_test_ZDll.h的头文件,内容如图所示:
在这里插入图片描述

3、使用Visual Studio编写c++代码实现头文件接口并生成dll文件

把上一步生成的头文件com_test_ZDll.h给到c++程序员来实现,或者如我们此示例中自己实现此处可下载测试jni.dll,步骤如下:

  • 打开Visual Studio 2022 -> 创建新项目,找到Windows桌面向导,打开配置新项目窗口,依次填写项目名称为jni、位置、创建新解决方案,然后点击’创建‘,在弹出的桌面项目窗口,依次选择应用程序类型为’动态链接库(.dll)’ ->其他选项为’空项目‘,再点击’确定‘即可。
    在这里插入图片描述
    在这里插入图片描述在这里插入图片描述在这里插入图片描述
  • 编写c++代码nativeCode.cpp实现com_test_ZDll.h头文件接口。具体步骤:
    在左侧jni项目的’源文件’项下右键依次选择’添加’ -> ‘新建项’ -> ‘Visual C++’ -> C++文件(.cpp) -> 然后填写名称为nativeCode -> 最后点击’添加’即可创建出nativeCode.cpp文件。nativeCode.cpp源码如下,以下代码实现了打印语句及返回字符串’hello zdll’功能:在这里插入图片描述
  • 调试C++代码,添加依赖项
    上面的代码编写完后会有编译问题,请按下面步骤来设置:
    在这里插入图片描述
    配置jdk include及win32目录(以下图片用的是idea自带jdk,可参考)
    在这里插入图片描述
    配置jdk lib包目录
    在这里插入图片描述配置com_test_ZDll.h头文件所在目录
    在这里插入图片描述
  • 生成dll
    配置项完成后,C++源代码便不会有编译报错问题,现在可以开始生成dll了。首先右击解决方案jni,再点击‘生成’项,再看输出页中出现‘成功1个,失败0个,跳过0个’字眼即为成功生成。dll生成的目录一般为解决方案所在目录下的x64/Debug目录下。
    在这里插入图片描述在这里插入图片描述在这里插入图片描述

4、将生成的jni.dll文件放入jdk bin下

5、编写java测试类,调用dll

在IDEA中创建测试类NativeTest.java,编写以下测试代码。
在这里插入图片描述
测试结果:正确打印出DLL中返回的字符串及打印语句。说明Java JNI调用dll成功了!

附:问题

java测试类执行出现报错:java.lang.UnsatisfiedLinkError: xx\jni.dll: Can’t find dependent libraries

分析:jni.dll缺少依赖的包
解决:下载depends工具,下载并解压,运行depends.exe,打开调用的jni.dll,有黄色感叹号的代表缺的dll文件,缺失的dll从其它机器复制过来,放到本机C:\Windows\System32目录下,再次尝试执行java即可。
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

上门家教app小程序源码开发的前景如何?

随着我国生活水平的提高,教育方面的问题也越来越受到家长们的重视,很多家庭都开始通过家教以及辅导班等方式增强学生的学业知识,因此家教app开发是拥有很大一部分用户市场的。那么家教app开发主要适合什么行业呢? 上门家教服务或…

Zabbix-客户端部署全过程

本文已收录于专栏 《中间件合集》 目录 概念说明什么是Zabbix 功能介绍配置过程1.在linux下的admin文件夹下创建zabbix文件夹2.把agent端压缩包放置到home/admin/zabbix路径下3.解压安装包4.创建zabbix日志文件5.进入到conf文件夹下,修改配置文件,与serv…

Linux系统下网络性能监控指令(iftop、nload)

文章目录 iftop参数快捷键iftop界面说明: nload参数示例 iftop 参数 -i 设定监测的网卡,如:# iftop -i eth1 -B 以bytes为单位显示流量(默认是bits),如:# iftop -B -n 使host信息默认直接都显示IP,如&…

今天给大家安利几款非常好用的文件迁移工具

文件迁移是我们平时经常需要处理的问题之一。在日常生活中,我们可能需要将一些文件从电脑上的一个位置迁移到另一个位置,或者将文件转移到外部硬盘或云端存储空间。而为了更加高效地完成这项任务,使用一款好用的文件迁移工具显得尤为重要。今…

基于smardaten无代码开发解决光伏电站项目

文章目录 前言一、事故背景二、解决方案三、工具加持四、配置要点解析1、光伏导航菜单搭建2、运行监控组件布局3、员工填报表单创建4、数据接入清洗5、复杂数据展示5、地图大屏组装6、定制页面集成 五、挖掘更多惊喜1、模拟数据生成2、智能分析结果3、草图智能识别4、日期排班设…

el-dialog设置滚动条不生效记录【草稿版,待优化】

目录 前言一、scrollTop是什么?二、解决步骤总结 前言 提示:这里可以添加本文要记录的大概内容: 技术栈 element-plus vue3 js 记录el-dialog的弹窗中,通过js控制滚动条不生效。 我这次的需求是这样的,点击某个按钮…

SSM-Spring项目使用Tomcat:7插件运行项目注意事项

文章目录 配置Tomcat:7插件(注意Path)运行tomcat:7第一种方式第二种方式 测试路径(注意)正确请求方式(注意路径) 配置Tomcat:7插件(注意Path) 作为演示,我这里特别配置了…

中学生台灯怎么选比较好?精选真正适合中学生的台灯!

现在孩子的近视率很高,尤其是儿童青少年居多,从上了小学开始作业就变多了,经常挑起夜灯学习的,而中学生负担则更重。家长重视教育质量的同时也要注意孩子学习时的光线适合学习吗?用眼过度和不适合的光源容易导致近视&a…

Sangfor华东天勇战队:jeecg-boot登录分析

realkey获取 7evs1680077379806 可以看到代码逻辑如下,md5(小写验证码checkKey),这里checkKey是时间戳 然后继续往下看 这里checkcode取值为空,这是为什么呢,是因为redisUtil中没有获得,登录的时候会存到redis中&a…

SLAM之反求运动和地图点(对极几何)

简介 前面的文章介绍了如何在已知空间点的情况下在不同坐标系中的表示(刚体的坐标变换),以及如何将空间中的点投影到相机中生成图像,但是现实中的情况却是相反的情况(空间点以及坐标系之间的变换未知)&…

【裸机开发】定时器按键消抖(EPIT)

实际工程中,不能直接通过延时来消抖 ! 这里我们采用定时器来消抖,这也是内核处理消抖的一种方式。 目录 一、基本原理 1、延时消抖的弊端 2、定时器消抖原理 二、按键消抖实现 1、按键中断 2、定时器中断 三、附加:按键 / 定时器中断初…

前后端分离开发跨域问题总结

前后端分离开发跨域问题总结 一、什么是跨域访问二、解决跨域问题1、Vue前端配置代理解决跨域2、SpringBoot后端配置解决跨域2.1 跨域配置类CorsConfig(常用)2.2 Controller添加CrossOrigin注解2.3 添加CORS过滤器CorsFilter(常用&#xff09…

selenium之鼠标操作

首先导入ActionChains类,该类可以完成鼠标移动,鼠标点击事件,键盘输入、内容菜单交互等交互行为。 from selenium.webdriver.common.action_chains import ActionChains 操作语法: 第一步:初始化ActionChains类&…

系列二、Maven下载安装配置

一、下载 链接:https://pan.baidu.com/s/1BvwLzAk9kRSP-daxSYe4Vw?pwdyyds 提取码:yyds 二、安装 第一步:下载安装包 第二步:解压至安装目录,例如 第三步:配置settings.xml(主要配置maven本…

Open ai 开发指南:gpt接口的第一个问答机器人demo

目录 内容 Python代码 C 代码 workspace 文件 BUILD文件 Java 代码 maven文件 执行效果 内容 基于openai接口实现循环gpt问答,并使用一个文件将问答内容进行记录。 Python代码 # -*- coding: utf-8 -*- import openai import time from pathlib import P…

100天精通Python(可视化篇)——第93天:Pyecharts绘制多种炫酷饼图参数说明+代码实战(百分比、环形、玫瑰、内嵌、多个子图饼图)

文章目录 专栏导读1. 基础饼图add函数简单案例改变颜色 2. 百分比饼图3. 环形饼图4. 玫瑰饼图5. 内嵌环图6. 多个饼图 专栏导读 🔥🔥本文已收录于《100天精通Python从入门到就业》:本专栏专门针对零基础和需要进阶提升的同学所准备的一套完整…

学习前端开发,能抛弃HTML和CSS吗?

前言 前端开发里面HTML和CSS是两个非常重要的核心技术,它们是构建网页和应用程序界面的基础。 HTML(超文本标记语言)是用于描述网页结构的标记语言,它定义了网页的内容、布局和元素。几乎所有的网页都使用HTML来组织和呈现内容&…

5.6.3 套接字

5.6.3 套接字 我们先以示例引入套接字的基本内容,我们知道在邮政通信的时候我们需要在信封上写明我们的收件地址,比如北京市海淀区双清路30号清华大学8444号某某某收,这其中我们需要一个物理地址“北京市海淀区双清路30号”,一个…

SpringBoot 如何使用 Ehcache 作为缓存?

SpringBoot 如何使用 Ehcache 作为缓存? 在现代的应用程序中,缓存是一个非常重要的概念。缓存可以帮助我们加速应用程序的响应时间,减少数据库或其他服务的负载,并提高系统的可扩展性和容错性。Spring Framework 提供了强大的缓存…

Linux下的su指令和last指令

文章目录 1 切换用户命令(su)2 查看本机的所有登录记录(last)3 退出当前登录账户(exit) 1 切换用户命令(su) su 命令可以切换成不同的用户身份,命令格式如下&#xff1a…