zoukankan      html  css  js  c++  java
  • 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
    ");
    
            for (int i=0;i < args.length;i++) {
                CLibrary.INSTANCE.printf("Argument %d: %s
    ", 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());
    }
    
  • 相关阅读:
    编写高质量代码建议17代码错误调试
    同步和异步的不同场景的概念理解
    kafka版本0.8.2.0-Producer Configs之request.required.acks
    linux的grep命令
    jetty服务器访问系统的域名
    linux工具问题,tail -f 失效
    memcached并发处理
    python爬虫scrapy的Selectors参考文档
    访问nginx提示gateway timeout 504 ,发现总是当调用时间超过30s时提示504错误
    重构再次理解
  • 原文地址:https://www.cnblogs.com/Desneo/p/7598806.html
Copyright © 2011-2022 走看看