JNA-调用win32 Dll文件
1. 描述备注
参考地址1
JNA示例代码
1.1 JNA工作原理
JNA是建立在JNI技术基础之上的一个Java类库,它使您可以方便地使用java直接访问动态链接库中的函数。
原来使用JNI,你必须手工用C写一个动态链接库,在C语言中映射Java的数据类型。
JNA中,它提供了一个动态的C语言编写的转发器,可以自动实现Java和C的数据类型映射。你不再需要编写C动态链接库。
JNA把一个dll/.so文件看做是一个java接口。Dll是C函数的集合、容器,这和java接口的概念吻合。
1.2 Java和C数据类型对应表
| Java Type | C Type | Native Representation |
|---|---|---|
| boolean | int | 32-bit integer (customizable) |
| byte | char | 8-bit integer |
| char | wchar_t | platform-dependent |
| short | short | 16 bit integer |
| int | int | 32 bit integer |
| long | long long,_int64 | 64 bit integer |
| float | float | 32-bit floating point |
| double | double | 364-bit floating point |
| Buffer Pointer | pointer | platform-dependent (32- or 64-bit pointer to memory) |
| [] (array of primitive type) | 32- or 64-bit pointer to memory (argument/return) contiguous memory (struct member) | |
| String | char* | NUL-terminated array (native encoding or jna.encoding) |
| WString | wchar* | NUL-terminated array (unicode) |
| String[] | char** | NULL-terminated array of C strings |
| WString[] | wchar** | NULL-terminated array of wide C strings |
| Structure | struct* struct | pointer to struct (argument or return) (or explicitly) struct by value (member of struct) (or explicitly) |
| Union | union | same as Structure |
| Structure[] | struct[] | array of structs, contiguous in memory |
| Callback | (*fp)() | function pointer (Java or native) |
| NativeMapped | varies | depends on definition |
| NativeLong | long | platform-dependent (32- or 64-bit integer) |
| PointerType | pointer | same as Pointer |
1.5 POM.xml
<dependency>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna</artifactId>
<version>4.5.0</version>
</dependency>
<dependency>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna-platform</artifactId>
<version>4.5.0</version>
</dependency>
2. 示例
2.1示例1-普通调用
public class HelloWorld {
//定义一个接口,继承自Library或stdCallLibrary,默认的是继承Library ,如果动态链接库里的函数是以stdcall方式输出的,那么就继承StdCallLibrary,比如众所周知的kernel32库。
public interface CLibrary extends Library {
//接口内部需要一个公共静态常量:INSTANCE,通过这个常量,就可以获得这个接口的实例,从而使用接口的方法,也就是调用外部dll/so的函数。
//通过Native.loadLibrary() API获取,
//第一个参数是动态链接库dll/so的名称,不带后缀。搜索动态链接库路径的顺序是:当前类的目录-->工程文件夹下面找win32/win64文件夹下搜
-->WINDOWS下面去搜索,再找不到就会抛异常了。比如上例中printf函数在Windows平台下所在的dll库名称是msvcrt,而在其它平台如Linux下的so库名称是c。
//第二个参数是本接口的Class类型。JNA通过这个Class类型,根据指定的.dll/.so文件,动态创建接口的实例。该实例由JNA通过反射自动生成
CLibrary INSTANCE = (CLibrary)Native.loadLibrary((Platform.isWindows() ? "msvcrt" : "c"),CLibrary.class);
//接口中只需要定义你要用到的函数或者公共变量,不需要的可以不定义,如上例只定义printf函数, 入参和出参和dll中定义保持一致
void printf(String format, Object... args);
}
public static void main(String[] args) {
//直接调用即可
CLibrary.INSTANCE.printf("Hello, World\n");
for (int i=0;i < args.length;i++) {
CLibrary.INSTANCE.printf("Argument %d: %s\n", i, args[i]);
}
}
}
2.2 示例2-调用win32DLL(JNA已封装)
//获取系统时间
Kernel32 lib = Kernel32.INSTANCE;
SYSTEMTIME time = new SYSTEMTIME();
lib.GetSystemTime(time);
System.out.println("Today's integer value is " + time.wDay);
示例3-Win32API 操作进程
Kernel32 lib = Kernel32.INSTANCE;
// 获取进程快照
HANDLE hSnapshot = lib.CreateToolhelp32Snapshot(Tlhelp32.TH32CS_SNAPPROCESS, new DWORD(0));
// 获取进程
PROCESSENTRY32 pe32 = new PROCESSENTRY32();
// lib.Process32First(hSnapshot, lppe);
while (lib.Process32Next(hSnapshot, pe32)) {
DWORD processId = pe32.th32ProcessID;
char[] name = pe32.szExeFile;
System.out.println("进程id: " + processId + " ; " + "进程名称: " + new String(name));
// 打开进程
HANDLE processHandle = lib.OpenProcess(WinNT.PROCESS_ALL_ACCESS, false, pe32.th32ProcessID.intValue());
}
JNA-调用win32 Dll文件的更多相关文章
- 在 C# 中通过 P/Invoke 调用Win32 DLL
在 C# 中通过 P/Invoke 调用Win32 DLL 发布日期 : 1/13/2005 | 更新日期 : 1/13/2005 Jason Clark 下载本文的代码: NET0307.exe ( ...
- Atitit.java jna 调用c++ dll 的总结
Atitit.java jna 调用c++ dll 的总结 1. JNA技术解密1 1.1. JNA工作原理1 2. JNA技术难点 Java—C和操作系统数据类型的对应表1 2.1. 1 2.2. ...
- Java调用第三方dll文件的使用方法 System.load()或System.loadLibrary()
Java调用第三方dll文件的使用方法 public class OtherAdapter { static { //System.loadLibrary("Connector") ...
- C# 调用win32 DLL报错 System.BadImageFormatException
C# 调用win32 DLL报错 System.BadImageFormatException 项目右键属性->项目设计器->生成->平台->把'默认设置(任何 CPU)'改 ...
- C#调用C++ DLL 文件
说来惭愧,都注册一年多了,却没有发表过一篇正式的博文,中间很多学习的过程也没有记录下来.如今到了一个新的环境,也有了学习的机会,一定要把每天的收获记录一下. 要做的东西需要引用C++编写的DLL,刚开 ...
- 对C#调用C++ dll文件进行总结
在实际项目工作中,经常用到C#调用C++ 或者C编写的dll文件. dll支持一般函数声明和类的定义声明,但是一般为了简化,都是 采用函数声明的方式.这里主要并不是写 dll的编写. 先在vs中创建一 ...
- java调用c#dll文件配置
1 在强大的c#语言和java语言之间,二者难免会因为某些特殊的要求会相互调用. 下面就以java调用c#的dll为例做详细介绍 1 在vs中的环境设置如下图,图片中程序仅作为讲解程序,在项目编译成 ...
- VS2010 C#调用C++ DLL文件 【转】
http://www.soaspx.com/dotnet/csharp/csharp_20110406_7469.html 背景 在项目过程中,有时候你需要调用非C#编写的DLL文件,尤其在使用一些第 ...
- 用vc生成可被python调用的dll文件
前提已经有.c 和.i文件 用swid编译了.i文件生成了wrap.c文件和.py文件 vc创建dll工程 将.h加入到头文件中.c文件和wrap.c文件添加到源文件中 将.i文件添加到工程目录下To ...
随机推荐
- 一. kafka 入门
一.基本概念 Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据.这种动作(网页浏览,搜索和其他用户的行动)是在现代网络上的许多社会功能的一个关键因素. K ...
- POST-GET请求
在应用中最常用的Http请求无非是get和post,get请求可以获取静态页面,也可以把参数放在URL字串后面,传递给servlet.post与get的不同之处在于post的参数不是放在URL字串里面 ...
- Win10 上 安装Arduino 驱动 和 Arduino IDE 1.6.9
Win10 安装Arduino IDE软件 和 驱动 在Win10 上安装最新的Arduino IDE (1.6.9安装包)很简单,并且不行要手动安装Arduino板子的驱动,整个安装过程都当前的简单 ...
- JS中双击和单击事件冲突解决
在JS中代码中同一功能块中通常同时会用到单击.双击事件,但通常会遇到一个问题,就是在双击的时候即执行了一次双击事件,而且还执行了两次单击事件.此类冲突在ZTree.DHTMLX中经常遇到. 想要解决两 ...
- Thinkphp的import使用方法
Thinkphp的import使用方法主要有以下4种,在此记下以供查询.原文链接:http://www.jb51.net/article/51765.htm 感谢. 1.用法一 import( ...
- 【转】‘svn’不是内部或外部命令,也不是可运行的程序
解决方法:windows安装svn的时候默认是不安装 svn command line这个东西的,重新打开svn的安装exe,选择modify,将“command line client tools” ...
- 【WIP】客户端JavaScript 事件处理
创建: 2017/10/15 完成: 2017/10/15 更新: 2017/11/04 加粗事件的参数 更新: 2017/12/12 增加事件处理时获取事件对象的方法 更新: 2019/05/2 ...
- 2017-10-17 NOIP模拟赛
Reverse #include<iostream> #include<cstdio> #include<cstring> using namespace std; ...
- Java——利用集合类实现简单斗地主发牌
import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util ...
- Ryzen 移动平台上安装 Gentoo Linux
Linux 内核对于跟进支持 Ryzen 移动低压 CPU 的热情似乎和市面上寥寥无几的 Ryzen 笔记本热度十分吻合.虽然从 Linux 4.11 起就对 Ryzen 桌面 CPU 有较好的支持, ...