目标

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

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐