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 TypeC TypeNative Representation
booleanint32-bit integer (customizable)
bytechar8-bit integer
charwchar_tplatform-dependent
shortshort16 bit integer
intint32 bit integer
longlong long,_int6464 bit integer
floatfloat32-bit floating point
doubledouble364-bit floating point
Buffer Pointerpointerplatform-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)
Stringchar*NUL-terminated array (native encoding or jna.encoding)
WStringwchar*NUL-terminated array (unicode)
String[]char**NULL-terminated array of C strings
WString[]wchar**NULL-terminated array of wide C strings
Structurestruct* structpointer to struct (argument or return) (or explicitly) struct by value (member of struct) (or explicitly)
Unionunionsame as Structure
Structure[]struct[]array of structs, contiguous in memory
Callback (*fp)()function pointer (Java or native)
NativeMappedvariesdepends on definition
NativeLonglongplatform-dependent (32- or 64-bit integer)
PointerTypepointersame 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());
}

转载于:https://www.cnblogs.com/Desneo/p/7598806.html

### 回答1: jna-5.9.0.jar是Java Native Access(JNA)的一个软件包。JNA是一个Java编程语言的库,用于访问本地平台特定的API,如Microsoft Windows上的Win32 API和Linux上的POSIX。这个库允许Java开发人员直接与本地代码交互,从而充分利用本地平台功能,提高应用程序的性能和功能。 使用JNAJava开发人员可以调用一个本地库中的函数或动态链接库,并使其在Java应用程序中可用。在调用本地方法时,不需要手动编写JNI(Java Native Interface)代码,只需编写Java参数和返回类型的映射。这使得JNA在开发跨平台程序时特别有用。 jna-5.9.0.jar是JNA的最新版本,它包括了许多新的特性和改进,例如性能、安全性和自定义类型等。此外,它还包括许多实用程序和示例,提供了丰富的资源和文档,使得Java开发人员可以更轻松地理解和使用JNA。 总之,jna-5.9.0.jar是一个非常重要的软件包,它为Java开发人员提供了一种强大的方式来访问本地平台功能,使得Java应用程序可以更加高效和功能丰富。 ### 回答2: jna-5.9.0.jar是Java Native Access(JNA)框架的一个版本,该框架允许Java应用程序直接访问本地机器上的原生库。它提供了一个纯Java库,可以轻松的调用本地库函数,而不需要手动编写JNI代码。这个框架可以帮助Java程序员通过本地代码来提供更高的性能和更大的灵活性。 JNA框架在操作系统和其他原生库之间提供了一个接口层,Java程序员可以自由地使用Java API来调用原生库。这使得Java开发者可以使用原生的操作系统调用和底层硬件,从而实现更高效、更具响应性的程序。在很多应用中,JNA可以显着提高性能和扩展性,从而使得应用程序更加稳定和可靠。 jna-5.9.0.jar提供了一些新的特性和改进,例如支持Java 14和15,通过内联函数来提高性能,以及对Windows 11和macOS Monterey的支持。此外,该版本还修复了一些bugs和其它问题,以提供更好的用户体验。 总之,jna-5.9.0.jar是一个值得关注的框架版本,它能够帮助Java程序员更便捷地访问原生库,从而实现更高效、更具响应性的程序。 ### 回答3: jna-5.9.0.jar是Java Native Access(JNA)的Java包。它提供了一种简单的Java API,可用于为所有平台编写和使用本机程序库,而无需编写任何本机代码或尝试了解平台特定的C或C ++ API。JNA通过使用Java的反射功能来自动查找本机函数和数据类型来实现这一点。此外,JNA还提供了对所有平台的动态链接共享库(DLL或SO文件)进行加载和处理的功能。由于JNAJava代码,因此它可以很容易地部署和集成到Java应用程序中,并且避免了编写平台依赖的本机代码的繁琐工作。通过使用JNAJava程序员可以直接调用底层的本机API,无需了解底层操作系统。选择使用JNA,可以提高开发效率和代码复用性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值