写一篇博文记录一下最近自学的东西。
主要使用工具:IDEA、maven
主要参考代码:java使用JNA框架调用dll动态库:https://www.cnblogs.com/new-life/p/9345840.html
开始
1.新建一个springboot项目,如果你会其他的也可以。
不会新建的朋友可以参考:https://www.cnblogs.com/zslli/p/8693070.html
2.新建完成后,由于我用的是maven项目,所以不是去找jar包而是去maven官网找配置(建议谷歌浏览器,右击网页弹出的菜单里有个 翻成中文(简体) 的功能,对英语不是很好的朋友很有帮助)
下图:点击的是3.0.9那个红框,反正选最新的版本就行,上面那个红框是网页自带的,别弄错了。
<!-- https://mvnrepository.com/artifact/com.sun.jna/jna -->
<dependency>
<groupId>com.sun.jna</groupId>
<artifactId>jna</artifactId>
<version>3.0.9</version>
</dependency>
把这段配置copy到pom.xml中,右下角会弹出提示,点击import maven即可
3、既然我们要调用windows的API删除文件,那么我们首先要知道是哪个API
先百度:
点击上面的 Full Windows API Index 页面后,跳转的新页面,先翻译成中文(英文高手可无视),然后一直往下面拖动,直到
下面的选项,因为我们是要删除文件,肯定和文件功能有关
方法名称也是中文的原因是谷歌的翻译,不管,点进去。
OK,终于找到了。
题外话:以前用的DeleteFile,现在用的DeleteFileA,只要知道后面带A的是最新的函数,直接用就行,不用管其他。
然后还是上图的页面,拖到最下面,
这个就是调用删除文件API对应的DLL文件。
4、开始写代码
首先新建一个接口
package com.zcit.dlltest;
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Platform;
/**
* DLL动态库调用接口
*
*/
public interface CLibrary extends Library {
CLibrary INSTANCE = (CLibrary) Native.loadLibrary((Platform.isWindows() ? "KERNEL32" : "c"),CLibrary.class);
//声明要调用的DLL中的方法
int DeleteFileA(String fileName);
}
相信大家可以看懂KERNEL32就是上面我们找到的DLL文件的名称,而声明的方法就是我们找到的DeleteFileA的句法的函数名,根据返回值的描述返回的是0或者非零值–我们设定返回值为int(一般成功的话返回的是删除的文件数量的整数),参数是文件名称,这些第三步里面我们找到的API里面都有说明。
再新建一个类,
package com.zcit.dlltest;
public class JNADllCall{
public static void main(String[] args) {
int temp = CLibrary.INSTANCE.DeleteFileA("C:\\Users\\Administrator\\Desktop\\123.txt");
System.out.println(temp);
}
}
我在桌面新建了一个文本文档并命名为123,然后把路径写上来。
直接运行该类,会发现文件成功被彻底删除了,回收站都找不到。
大功告成。
【拓展】
我们在DeleteFileA的页面还可以看到 GetLastError 这个方法
那么,有兴趣的同学可以试试函数返回失败时(例如文件不存在的情况),调用该方法来查看返回的错误信息,并且可以找找返回的错误信息代码对应的描述。
PS:本人第一次写博客,难免有很多不足和错漏知足,希望大家多多担待。