java使用JNA框架调用dll动态库
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java使用JNA框架调用dll动态库,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2764字,纯文字阅读大概需要4分钟。
内容图文
这两天了解了一下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); } publicstaticvoid 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 */publicinterface CLibrary extends Library { // DLL文件默认路径为项目根目录,若DLL文件存放在项目外,请使用绝对路径 CLibrary INSTANCE = (CLibrary) Native.loadLibrary((Platform.isWindows() ? "msvcrt" : "c"), CLibrary.class); // 声明将要调用的DLL中的方法(可以是多个方法)void printf(String format, Object... args); } publicstaticvoid 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
原文:https://www.cnblogs.com/new-life/p/9345840.html
内容总结
以上是互联网集市为您收集整理的java使用JNA框架调用dll动态库全部内容,希望文章能够帮你解决java使用JNA框架调用dll动态库所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。