Java使用JNA方式调用DLL(动态链接库)(原创,装载请注明出处)
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(动态链接库)(原创,装载请注明出处)的更多相关文章
- java使用JNA框架调用dll动态库
这两天了解了一下java调用dll动态库的方法,总的有三种:JNI.JNA.JNative.其中JNA调用DLL是最方便的. ·JNI ·JNA ·JNative java使用 JNI来调用dll动态 ...
- java 用JNA方法调用C++动态链接库
JNA(Java Native Access)框架是一个开源的Java框架,是SUN公司主导开发的,建立在经典的JNI的基础之上的一个框架.非常强大.易用,功能上类似与.NET的P/Invoke.你只 ...
- C和C++中动态链接库的创建和链接(原创,装载请注明原处)
C和C++中动态链接库的创建和链接 1.创建DLL(动态链接库)-C++方式 1.创建DLL(动态链接库-C++方式) 1.在VS(以VS2017为例)中创建DLL动态链接库. 解决方案名称为:MyD ...
- Java(使用JNA)调用DLL库与C#调用DLL库的对比
前言:在项目中经常使用DLL库对硬件进行操作,在发卡过程中使用频率尤为多,今天就Java与C#中调用DLL库的使用区别做一个介绍,本文着重具体的代码编写,具体过程看以下代码. 前提条件: 笔者已经封装 ...
- C#中调用Dll动态链接库
C#中调用Dll动态链接库 起始 受限于语言的不同,我们有的时候可能会用别人提供的函数及方法 或者其他的什么原因.反正就是要调!!! 恰巧别人所使用的的语言跟自己又不是一样的 这个时候想要调用别人的函 ...
- Java程序员面试宝典1 ---Java基础部分(该博文为原创,转载请注明出处)
(该博文为原创,转载请注明出处 http://www.cnblogs.com/luyijoy/ by白手伊凡) 1. 基本概念 1) Java为解释性语言,运行过程:程序源 ...
- Python调用DLL动态链接库——ctypes使用
最近要使用python调用C++编译生成的DLL动态链接库,因此学习了一下ctypes库的基本使用. ctypes是一个用于Python的外部函数库,它提供C兼容的数据类型,并允许在DLL或共享库中调 ...
- c#下调用dll动态链接库[转]
C# 调用传统的 API 动态链接库,是.NET开发经常被讨论的问题. 比如有这么一个动态链接库(delphi 语言): library DelphiDLL; uses SysUtils, Class ...
- VS2015环境下生成和调用DLL动态链接库
一.生成动态链接库: 1.打开VS2015->文件->新建->项目->Visual C++->Win32->Win32控制台应用程序->将名称改为dll_ge ...
随机推荐
- bzoj P1979 华容道【bfs+spfa】
调死我了-- 首先观察移动方式,需要移动的格子每次移动到相邻格子,一定是先把空白格子挪过去,所以我们得到一种做法,就是bfs预处理出每一个格子的四联通格子之间的空白格子移动距离建边,注意这个移动是不能 ...
- X86 Linux 下 SIGBUS 总结
SIGBUS 在 x86 Linux 上并不多见,但一旦出现,其调用堆栈常常让人摸不着头脑,加之信号问题各平台系统间差异较大,更让人难以理清,这里稍微总结一下 x86 Linux 上大概有哪些情形会触 ...
- 标准块CP功能实现
#include<stdio.h> int main(int argc,char *argv[]) { FILE *src_fp,*des_fp; int src_ret; ]={}; ) ...
- yml文件教程
地址:http://www.ruanyifeng.com/blog/2016/07/yaml.html 原来三个横线(---)是用来区分多个文件的,像下面就是指定了两个配置. spring: appl ...
- [USACO 2011 Nov Gold] Above the Median【逆序对】
传送门:http://www.usaco.org/index.php?page=viewproblem2&cpid=91 这一题我很快的想出了,把>= x的值改为1,< x的改为- ...
- 尺取法 POJ 3601 Subsequence
题目传送门 /* 题意:求连续子序列的和不小于s的长度的最小值 尺取法:对数组保存一组下标(起点,终点),使用两端点得到答案 1. 记录前i项的总和,求[i, p)长度的最小值,用二分找到sum[p] ...
- ASP.NET CORE 使用 EF CORE访问数据库
asp.net core通过ef core来访问数据库,这里用的是代码优先,通过迁移来同步数据库与模型. 环境:vs2017,win10,asp.net core 2.1 一.从建立asp.net c ...
- CentOS安装GlassFish4.0 配置JDBC连接MySQL
转自:http://linux.it.net.cn/CentOS/course/2014/0724/3319.html 版本glassfish-4.0.zip 1.解压,拷贝到指定安装路径 unz ...
- 【LeetCode】297. Serialize and Deserialize Binary Tree
二叉树的序列化与反序列化. 如果使用string作为媒介来存储,传递序列化结果的话,会给反序列话带来很多不方便. 这里学会了使用 sstream 中的 输入流'istringstream' 和 输出流 ...
- 原创 SqlParameter 事务 批量数据插入
不错,很好,以后防注入批量事务提交虽然麻烦点研究了几个小时,但不会是问题了 SqlCommand cmd; HelpSqlServer helps = new HelpSqlServer(); //定 ...