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文件的更多相关文章

  1. 在 C# 中通过 P/Invoke 调用Win32 DLL

    在 C# 中通过 P/Invoke 调用Win32 DLL 发布日期 : 1/13/2005 | 更新日期 : 1/13/2005 Jason Clark 下载本文的代码: NET0307.exe ( ...

  2. 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.  ...

  3. Java调用第三方dll文件的使用方法 System.load()或System.loadLibrary()

    Java调用第三方dll文件的使用方法 public class OtherAdapter { static { //System.loadLibrary("Connector") ...

  4. C# 调用win32 DLL报错 System.BadImageFormatException

    C# 调用win32 DLL报错  System.BadImageFormatException 项目右键属性->项目设计器->生成->平台->把'默认设置(任何 CPU)'改 ...

  5. C#调用C++ DLL 文件

    说来惭愧,都注册一年多了,却没有发表过一篇正式的博文,中间很多学习的过程也没有记录下来.如今到了一个新的环境,也有了学习的机会,一定要把每天的收获记录一下. 要做的东西需要引用C++编写的DLL,刚开 ...

  6. 对C#调用C++ dll文件进行总结

    在实际项目工作中,经常用到C#调用C++ 或者C编写的dll文件. dll支持一般函数声明和类的定义声明,但是一般为了简化,都是 采用函数声明的方式.这里主要并不是写 dll的编写. 先在vs中创建一 ...

  7. java调用c#dll文件配置

    1 在强大的c#语言和java语言之间,二者难免会因为某些特殊的要求会相互调用. 下面就以java调用c#的dll为例做详细介绍 1  在vs中的环境设置如下图,图片中程序仅作为讲解程序,在项目编译成 ...

  8. VS2010 C#调用C++ DLL文件 【转】

    http://www.soaspx.com/dotnet/csharp/csharp_20110406_7469.html 背景 在项目过程中,有时候你需要调用非C#编写的DLL文件,尤其在使用一些第 ...

  9. 用vc生成可被python调用的dll文件

    前提已经有.c 和.i文件 用swid编译了.i文件生成了wrap.c文件和.py文件 vc创建dll工程 将.h加入到头文件中.c文件和wrap.c文件添加到源文件中 将.i文件添加到工程目录下To ...

随机推荐

  1. 【转】 Pro Android学习笔记(三一):Menu(2):扩展、图片、子菜单

    目录(?)[-] 菜单扩展 菜单项加入图片 子菜单 菜单扩展 如果菜单项很多,超过六个时,就会采用菜单扩展模式.在例子中我加入了10个菜单项,预计能进入菜单扩展模式,但是实际效果如右图所示.效果和li ...

  2. Spring Boot中使用RabbitMQ

    很久没有写Spring Boot的内容了,正好最近在写Spring Cloud Bus的内容,因为内容会有一些相关性,所以先补一篇关于AMQP的整合. Message Broker与AMQP简介 Me ...

  3. JVM体系结构之六:堆Heap之1

    一.简介 对于大多数应用来说,Java 堆(Java Heap)是Java 虚拟机所管理的内存中最大的一块.Java 堆是被所有线程共享的一块内存区域,在虚拟机启动时创建.此内存区域的唯一目的就是存放 ...

  4. hbase->Mapreduce->hbase

    Hbase对Mapreduce API进行了扩展,方便Mapreduce任务读写HTable数据. package taglib.customer; import java.io.IOExceptio ...

  5. win7 64位安装nokia 920驱动

    折腾了很长时间,终于安装成功,先将一些步骤记下来,此方法适用于哪些网上常规方法无法安装驱动的: 需要注意920不要连到电脑上的USB3.0接口,相关文件下载地址:http://pan.baidu.co ...

  6. linux学习第一周小结

    这几天学习linux课程,安装环境,遇到不会的查询资料,在这个过程中发现了很多有意思的网页,看到了一些不一样的内容,现在对linux的学习兴趣增强了许多.学习解决问题也是很有意思的事情,解决问题的过程 ...

  7. Postman使用-2

    转载:https://www.cnblogs.com/yunman/p/7884537.html Postman是一款功能强大的网页调试与发送网页HTTP请求的Chrome插件. 接口请求流程 一.g ...

  8. If,for,range混合使用笔记-(VBA视频教程2:使用IF进行逻辑判断)

    -- 新建表格:#单元格a1-a100全部等于1的代码 Sub test() Dim i As Integer For i = To Range( Next End Sub -- 新建表格:#单元格a ...

  9. CentOS7 LVM磁盘扩容

    1:创建磁盘分区(注意红色命令部分) [root@hongyin-test- ~]# fdisk /dev/sda Welcome to fdisk (util-linux ). Changes wi ...

  10. spring零配置AOP踩坑指南

    今天照着书,试着配了AOP(全注解),结果踩了各种坑,后来参考书附带的源码,终于走出来了,现在总结一下 除了spring的jar包以外,还需要导入以下包: 1.Spring核心配置文件beans.xm ...