目录
- 目标
- 具体示例
- 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即可。