Java使用JNA调用DLL

1.准备

1.JDK环境

2.Eclipse

3.JNA包

下载JNA包:

(1).JNA的Github:https://github.com/java-native-access/jna

(2).下载JNA包:

https://maven.java.net/content/repositories/releases/net/java/dev/jna/jna/4.0.0/jna-4.0.0.jar

https://maven.java.net/content/repositories/releases/net/java/dev/jna/jna-platform/4.0.0/jna-platform-4.0.0.jar

4.需要调用的DLL(注意JDK版本位数要与DLL一致)

本文使用的DLL下载:

Dll2x86.dll:https://github.com/XiangJinPeng/NetworkFileStorage/raw/master/ProgrammingLanguage/C and C/Dynamic Link Library and Static Link Library/Files/Dll2x86.dll

Dll2x64.dll:https://github.com/XiangJinPeng/NetworkFileStorage/raw/master/ProgrammingLanguage/C and C/Dynamic Link Library and Static Link Library/Files/Dll2x64.dll

Dll2的编写请参考我的另一篇博客:https://www.cnblogs.com/xiangjinpeng/p/10192888.html

2.Java和C的数据类型对照表

Java中的数据类型和C中的数据类型声明关键字有所不同,在java代码中需要使用Java类型来代替C类型,下表为Java类型和C类型对照表。

Java数据类型与C数据类型对照表

3.编写调用系统DLL的Java代码

1.在Eclipse中新建Java工程

2.把jna-4.0.0.jar加入到工程的库中

3.新建Java类HelloWorld并输入如下代码

//导包
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Platform; public class HelloWorld {
/*需要定义一个接口,继承自Library 或StdCallLibrary。
默认的是继承Library ,如果动态链接库里的函数是以stdcall方式输出的,那么就继承StdCallLibrary,比如kernel32库。
*/
public interface CLibrary extends Library {
//加载msvcrt.dll库,此处不需要后缀.dll或.so
CLibrary INSTANCE = (CLibrary)
Native.loadLibrary((Platform.isWindows() ? "msvcrt" : "c"),
CLibrary.class);
//对msvcrt.dll中需要使用的printf函数进行声明
void printf(String format, Object... args);
} public static void main(String[] args) {
//使用printf函数
CLibrary.INSTANCE.printf("Hello, World\n");
for (int i=0;i < args.length;i++) {
CLibrary.INSTANCE.printf("Argument %d: %s\n", i, args[i]);
}
}
}

运行程序,如果没有带参数则只打印出“Hello, World”,如果带了参数,则会打印出所有的参数。

4.编写调用自己创建的DLL的代码

1.新建Java工程

2.把jna-4.0.0.jar加入到工程的库中

3.把需要使用的dll文件放入到java工程目录下的bin目录下

4.新建java类TestDll并输入如下代码:


import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Platform;
public class TestDll {
public interface CLibrary extends Library{
//此处我的jdk版本为64位,故加载64位的Dll
CLibrary INSTANCE = (CLibrary)Native.loadLibrary("Dll2x64",CLibrary.class);
//Dll2x64中定义的函数
double Add(double a,double b);
} public static void main(String[] args) {
System.out.println("3+4=Add(3,4)="+CLibrary.INSTANCE.Add(3,4));
}
}

输出结果:

5.出现Exception in thread "main" java.lang.UnsatisfiedLinkError: %1 不是有效的 Win32 应用程序,错误的解决办法。

如果出现下面的错误:



是因为jdk的位数与dll的位数不一致,换成一致的便可。

Java使用JNA方式调用DLL(动态链接库)(原创,装载请注明出处)的更多相关文章

  1. java使用JNA框架调用dll动态库

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

  2. java 用JNA方法调用C++动态链接库

    JNA(Java Native Access)框架是一个开源的Java框架,是SUN公司主导开发的,建立在经典的JNI的基础之上的一个框架.非常强大.易用,功能上类似与.NET的P/Invoke.你只 ...

  3. C和C++中动态链接库的创建和链接(原创,装载请注明原处)

    C和C++中动态链接库的创建和链接 1.创建DLL(动态链接库)-C++方式 1.创建DLL(动态链接库-C++方式) 1.在VS(以VS2017为例)中创建DLL动态链接库. 解决方案名称为:MyD ...

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

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

  5. C#中调用Dll动态链接库

    C#中调用Dll动态链接库 起始 受限于语言的不同,我们有的时候可能会用别人提供的函数及方法 或者其他的什么原因.反正就是要调!!! 恰巧别人所使用的的语言跟自己又不是一样的 这个时候想要调用别人的函 ...

  6. Java程序员面试宝典1 ---Java基础部分(该博文为原创,转载请注明出处)

    (该博文为原创,转载请注明出处   http://www.cnblogs.com/luyijoy/  by白手伊凡) 1.    基本概念 1)         Java为解释性语言,运行过程:程序源 ...

  7. Python调用DLL动态链接库——ctypes使用

    最近要使用python调用C++编译生成的DLL动态链接库,因此学习了一下ctypes库的基本使用. ctypes是一个用于Python的外部函数库,它提供C兼容的数据类型,并允许在DLL或共享库中调 ...

  8. c#下调用dll动态链接库[转]

    C# 调用传统的 API 动态链接库,是.NET开发经常被讨论的问题. 比如有这么一个动态链接库(delphi 语言): library DelphiDLL; uses SysUtils, Class ...

  9. VS2015环境下生成和调用DLL动态链接库

    一.生成动态链接库: 1.打开VS2015->文件->新建->项目->Visual C++->Win32->Win32控制台应用程序->将名称改为dll_ge ...

随机推荐

  1. 12_传智播客iOS视频教程_注释和函数的定义和调用

    OC的注释和C语言的注释一模一样.它也分单行注释和多行注释. OC程序里面当然可以定义一个函数.并且定义的方式方法和调用的方式方法和我们C语言是一模一样的.OC有什么好学的?一样还学个什么呢? 重点是 ...

  2. asp.net mvc razer

    Asp.net MVC Razor模板引擎技巧分享 http://www.cnblogs.com/JustRun1983/p/3545303.html 全新的membership框架Asp.net I ...

  3. Windows NT/NTLM 加密

    Hash,一般翻译为“散列”,也有直接音译为“哈希”的,就是把任意长度的输入(又叫做预映射,pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值.这种转换是一种压缩映射,也就是散 ...

  4. Jquery 之deferred

    一.概述 在jquery中有种对象称之为延时对象,可以由 http请求方法$.get(), $.ajax(), $.post()  产生, 内置方法如下 也可以有jquery的延时方法 $.when( ...

  5. 关于MYSQL编辑乱码问题

    今天在SQLyog中编写表数据时突然出现一个bug,在此记录分享一下. 使用MySQL数据库时,讲中文插入到数据苦衷进行刷新后全部都变成了乱码问号,如下图中studentName列: 产生乱码是因为没 ...

  6. 51nod 1244 莫比乌斯函数之和 【莫比乌斯函数+杜教筛】

    和bzoj 3944比较像,但是时间卡的更死 设\( f(n)=\sum_{d|n}\mu(d) g(n)=\sum_{i=1}^{n}f(i) s(n)=\sum_{i=1}^{n}\mu(i) \ ...

  7. (图论)51NOD 1264 线段相交

    给出平面上两条线段的两个端点,判断这两条线段是否相交(有一个公共点或有部分重合认为相交). 如果相交,输出"Yes",否则输出"No".   输入 第1行:一个 ...

  8. python模拟登录的实现

    本文主要用python实现了对网站的模拟登录.通过自己构造post数据来用Python实现登录过程.   当你要模拟登录一个网站时,首先要搞清楚网站的登录处理细节(发了什么样的数据,给谁发等...). ...

  9. Qt对象模型之二:对象树与元对象系统

    一.对象树的概念 Qt中使用对象树(object tree)来组织和管理所有的QObject类及其子类的对象.当创建一个QObject时,如果使用了其他的对象作为其父对象(parent),那么这个 Q ...

  10. [TJOI2013]松鼠聚会

    Description 有N个小松鼠,它们的家用一个点x,y表示,两个点的距离定义为:点(x,y)和它周围的8个点即上下左右四个点和对角的四个点,距离为1.现在N个松鼠要走到一个松鼠家去,求走过的最短 ...