您现在的位置是:首页 > 正文

Java通过JNI调用dll动态库详细步骤 最新发布

2024-01-30 21:36:57阅读 0

目标

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即可。
在这里插入图片描述
在这里插入图片描述

网站文章

  • React解密:React高阶组件是什么?

    React中比较高大上的东西,高阶组件应该算是一个点,开发中也许写的不多,但是我们必须要直到高阶组件是什么,高阶组件能干什么?A higher-order component is a functio...

    2024-01-30 21:36:48
  • Django安装

    Django安装

    我们使用anaconda真实环境创建项目,这样可以更快的完成将来项目的创建一、环境配置(没有配置的同学需要进行操作)1.1查询anaconda环境1.1.1点击anaconda命令窗口1.1.2在命令...

    2024-01-30 21:36:41
  • 快速排序java练习

    快速排序java练习

    快速排序是一种高效的排序算法,其基本思想是通过一趟排序将待排序列分割成独立的两部分,其中一部分的所有元素都比另一部分的所有元素小,然后再分别对这两部分进行排序,最终得到一个有序序列。其具体实现如下:1...

    2024-01-30 21:36:11
  • 现代浏览器内部机制 Part 4 | 事件

    现代浏览器内部机制 Part 4 | 事件

    原文:Inside Look at Modern Web Browser(part 4)[1]作者:Mariko Kosaka[2]译者:kyrieliu终于到最后一篇了!作为这个系列的...

    2024-01-30 21:36:05
  • MySQL触发器

    触发器含义在发生insert,update,delete等事件时,符合特定条件后,执行特定语句即为触发器。触发器操作创建触发器create trigger 触发器名称 begin或者after 触发事件 on 表名 for each row 执行语句;create trigger 触发器名称 begin或者after 触发事件 on 表名 for each row begi

    2024-01-30 21:35:59
  • SparkSQL项目

    SparkSQL项目

    YARN产生背景MapReduce1.X的问题:JobTracker的压力太大了;YARN的产生YARN的架构1个RM(ResourceManager)+N个(NodeManager)Resource...

    2024-01-30 21:35:30
  • 基于element-ui的table实现树级表格操作及单元格合并

    基于element-ui的table实现树级表格操作及单元格合并

    基于element-ui的table,在一张表内实现多级树状数据展示及同属性的单元格合并,并在表格内实现增删改操作。

    2024-01-30 21:35:21
  • 差分算法(用python语言实现)

    差分算法,易上手

    2024-01-30 21:35:14
  • 《美图数据统计分析平台架构演进》阅读有感

    《美图数据统计分析平台架构演进》阅读有感

    《美图数据统计分析平台架构演进》阅读有感数据统计是一个比较尴尬的事情,第一个它可能不是一个非常有技术含量的事情,对于技术人员的成长来说不是非常好。第二它可能是一个比较重复工作的事,需要解决一些简单的需求的重复工作。统计业务与技术碰撞这基本上是我自己亲身的经历,刚开始一个人做这一块的业务,会碰到一些有意思的点,可能分三个阶段,第一个阶段是在项目的初期,我们是怎么样去应对一些产品的初期需求...

    2024-01-30 21:34:45
  • unity 3.6在import package时只有custom package

    unity 3.6在import package时只有custom package

    【问题描述】下载的unity 3.6在import package时只有custom package没有其他包文件【解决方案】在asset store里搜索Standard Assets选择导入即可导入完成后在左下角的project assets中多了一个Standard Assets文件夹打开即可使用...

    2024-01-30 21:34:37