这两天了解了一下java调用dll动态库的方法,总的有三种:JNI、JNA、JNative。其中JNA调用DLL是最方便的。

·JNI

·JNA

·JNative

java使用 JNI来调用dll动态库的调用,工作量略大,一般情况下开发人员会选用JNA或JNative。

使用JNative调用DLL除了要引入jar包外还需要额外引入一个dll文件,而JNA只需要引入jar即可使用。

使用JNA框架调用DLL动态库,步骤如下

1.导入JNA支持的jar包

添加jna-4.x.x.jar、jna-platform-4.x.x.jar到项目buildpath中(Maven项目可在中央仓库中搜索JNA的相关依赖添加到项目中)

2.代码调用DLL动态库方法

import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Platform;
import com.sun.jna.win32.StdCallLibrary; /**
* JNA框架DLL动态库读取调用示例类
* @ClassName: DllCall
* @Description: 读取调用DLL动态库文件中的方法
* @author: LinWenLi
* @date: 2018年7月18日 上午10:32:16
*/
public class JNADllCall {
/**
* DLL动态库调用方法
* @Description: 读取调用CDecl方式导出的DLL动态库方法
* @author: LinWenLi
* @date: 2018年7月18日 上午10:49:02
*/
public interface CLibrary extends Library {
// DLL文件默认路径为项目根目录,若DLL文件存放在项目外,请使用绝对路径。(此处:(Platform.isWindows()?"msvcrt":"c")指本地动态库msvcrt.dll)
CLibrary INSTANCE = (CLibrary) Native.loadLibrary((Platform.isWindows() ? "msvcrt" : "c"),
CLibrary.class); // 声明将要调用的DLL中的方法,可以是多个方法(此处示例调用本地动态库msvcrt.dll中的printf()方法)
void printf(String format, Object... args);
} public static void main(String[] args) {
CLibrary.INSTANCE.printf("Hello, World!");
}
}

注意:要调用的DLL位数要与JDK位数相同,否则无法调用。

郁闷的是,按照以上的官方测试代码运行后,控制台没有报错也没有打印出任何东西,在多次测试无果后我将C:\Windows\System32\msvcrt.dll复制到电脑桌面,再将代码中dll路径改为绝对路径,运行成功。

DLL的函数导出方式分为两种,其中StdCall方式导出的DLL,JNA的调用代码如下方的DLL动态库调用方法1,Decl方式导出的DLL,调用代码如DLL动态库调用方法2

import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Platform;
import com.sun.jna.win32.StdCallLibrary; /**
* JNA框架DLL动态库读取调用示例类
*
* @ClassName: DllCall
* @Description: 读取调用DLL动态库文件中的方法
* @author: LinWenLi
* @date: 2018年7月18日 上午10:32:16
*/
public class JNADllCall { /**
* DLL动态库调用方法1
*
* @Description: 读取调用StdCall方式导出的DLL动态库方法
* @author: LinWenLi
* @date: 2018年7月18日 上午10:37:58
*/
public interface StdCallDll extends StdCallLibrary {
// DLL文件默认路径为项目根目录,若DLL文件存放在项目外,请使用绝对路径
StdCallDll INSTANCE = (StdCallDll) Native.loadLibrary((Platform.isWindows() ? "msvcrt" : "c"),
StdCallDll.class);// 加载动态库文件
// 声明将要调用的DLL中的方法(可以是多个方法) void printf(String format, Object... args);
} /**
* DLL动态库调用方法2
*
* @Description: 读取调用Decl方式导出的DLL动态库方法
* @author: LinWenLi
* @date: 2018年7月18日 上午10:49:02
*/
public interface CLibrary extends Library {
// DLL文件默认路径为项目根目录,若DLL文件存放在项目外,请使用绝对路径
CLibrary INSTANCE = (CLibrary) Native.loadLibrary((Platform.isWindows() ? "msvcrt" : "c"),
CLibrary.class); // 声明将要调用的DLL中的方法(可以是多个方法)
void printf(String format, Object... args);
} public static void main(String[] args) {
StdCallDll.INSTANCE.printf("Hello, World!\n");
CLibrary.INSTANCE.printf("Hello, World\n");
}
}

以上简单记录java通过JNA框架调用DLL动态库的步骤,若需要进一步了解可参考以下博文地址:https://www.cnblogs.com/lanxuezaipiao/p/3635556.html

java使用JNA框架调用dll动态库的更多相关文章

  1. Java调用dll动态库

    最近项目里使用java调用dll动态库,因此研究了一下这方面的东西. 使用的工具包如下 <dependency> <groupId>net.java.dev.jna</g ...

  2. Java使用JNA方式调用DLL(动态链接库)(原创,装载请注明出处)

    Java使用JNA调用DLL 1.准备 1.JDK环境 2.Eclipse 3.JNA包 下载JNA包: (1).JNA的Github:https://github.com/java-native-a ...

  3. 应用程序调用dll动态库,参数有vector时崩溃的问题

    引用:http://blog.csdn.net/guoliushui/article/details/43017339 今天跟同事遇到了一个问题,问题背景: 一个动态库Tst.dll: 一个应用程序A ...

  4. JNI_Android项目中调用.so动态库

    JNI_Android项目中调用.so动态库 2014年6月3日 JNI学习 參考:http://blog.sina.com.cn/s/blog_4298002e01013zk8.html 上一篇笔者 ...

  5. Java(使用JNA)调用DLL库与C#调用DLL库的对比

    前言:在项目中经常使用DLL库对硬件进行操作,在发卡过程中使用频率尤为多,今天就Java与C#中调用DLL库的使用区别做一个介绍,本文着重具体的代码编写,具体过程看以下代码. 前提条件: 笔者已经封装 ...

  6. C#调用C++动态库(dll)

    在实际软件开发过程中,由于公司使用了多种语言开发,在C#中可能需要实现某个功能,而该功能可能用其他语言已经实现了,那么我们可以调用其他语言写好的模块吗?还有就是,由于C#开发好的项目,我们可以利用re ...

  7. Golang调用windows下的dll动态库中的函数

    Golang调用windows下的dll动态库中的函数 使用syscall调用. package main import ( "fmt" "syscall" & ...

  8. Delphi调用C# 编写dll动态库

    Delphi调用C# 编写dll动态库 编写C#dll的方法都一样,首先在vs2005中创建一个“类库”项目WZPayDll, using System.Runtime.InteropServices ...

  9. Delphi - Windows系统下,Delphi调用API函数和7z.dll动态库,自动把文件压缩成.tar.gz格式的文件

    项目背景 应欧美客户需求,需要将文件压缩成.tar.gz格式的文件,并上传给客户端SFTP服务器. 你懂的,7-Zip软件的显著特点是文件越大压缩比越高,在Linux系统上相当于我们Windows系统 ...

随机推荐

  1. window系统 查看端口 被哪个进程占用了

    一.在windows命令行窗口下执行:运行--cmdC:\>netstat -aon|findstr "8080" TCP     127.0.0.1:80       0. ...

  2. 2-6 ES6常用语法

  3. 使用showmap分析android进程内存占用情况(转载)

    转自:http://my.oschina.net/shaorongjie/blog/105354 可以使用adb shell showmap pid查看一个进程的showmap,这对于我们来说非常有用 ...

  4. 如何快速删除Linux下的svn隐藏文件及其他临时文件 (转载)

    转自:http://blog.csdn.net/edsam49/article/details/5840489 在Linux下,你的代码工程如果是用svn进行管理的,要删除Linux kernel里的 ...

  5. [Swift通天遁地]一、超级工具-(12)使用Toaster制作简短提示语的吐司窗口

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  6. Winform执行CMD命令

    1.首先分享CmdHelper类: using System; using System.Collections.Generic; using System.Text; using System.Di ...

  7. 【懒人专用系列】Xind2TestCase的初步探坑

    公司最近说要弄Xind2TestCase,让我们组先试用一下 解释:https://testerhome.com/topics/17554 github项目:https://github.com/zh ...

  8. ACM_18(同余)

    18 Time Limit: 2000/1000ms (Java/Others) Problem Description: 一个简单的问题,大家应该有不少做过大数加法题吧.这个题的数据也是64位整数放 ...

  9. [ SDOI 2006 ] 保安站岗

    \(\\\) Description 给出一棵 \(n\) 个节点以 \(1\) 为根的树,一个节点的覆盖半径是 \(1\) ,点有点权 \(val_x\) . 选择一些点,使得点权和最小,同时每个节 ...

  10. 关于加减和es6

    console.log(1+ "2"+"2");   //对于加法来说,如果只有一个操作数是字符串,则将另一个操作数也转换为字符串,然后将两者拼接,为122 c ...