ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

向JNA类Java(Kernel32)添加另一个方法

2019-10-13 13:13:53  阅读:389  来源: 互联网

标签:jna java methods insert kernel32


我试图使用WIN32 dll中的方法,但JNA中未包含该方法.

方法是GetProductInfo

我在单独的项目中尝试此工作:

  public interface Kernel32 extends Library {
    public boolean GetProductInfo(int dwOSMajorVersion,int dwOSMinorVersion,
        int dwSpMajorVersion, int dwSpMinorVersion, IntByReference pdwReturnedProductType);
  }  

使用..

    Kernel32 lib = (Kernel32) Native.loadLibrary("kernel32", Kernel32.class);
    IntByReference dwType = new IntByReference();
    lib.GetProductInfo(6,0,0,0,dwType);
    switch (dwType.getValue()) {
    // Something
    }

但是我需要使用JNA中实现的其他方法

import com.sun.jna.platform.win32.Kernel32;
import com.sun.jna.platform.win32.User32;
import com.sun.jna.platform.win32.WinBase;
import com.sun.jna.platform.win32.WinDef;
import com.sun.jna.platform.win32.WinNT;
import com.sun.jna.platform.win32.WinUser;

  public interface Kernel32 extends Library {

    Kernel32 INSTANCE = (Kernel32)Native.loadLibrary("kernel32", Kernel32.class);
    // I need to insert this method!!!
    public boolean GetProductInfo(int dwOSMajorVersion,int dwOSMinorVersion,
        int dwSpMajorVersion, int dwSpMinorVersion, IntByReference pdwReturnedProductType);

    // This snippet I think should not Needed, 
    //but if I remove this code this methods will not be recognized
    //but if I leave this code, it is not working properly!!!
    public void GetSystemInfo(WinBase.SYSTEM_INFO lpSystemInfo);
    public boolean GetVersionExA(WinNT.OSVERSIONINFOEX lpVersionInfo);
    public boolean GetVersionExA(WinNT.OSVERSIONINFO lpVersionInfo);
  }

使用代码:

  WinNT.OSVERSIONINFOEX osviex = new WinNT.OSVERSIONINFOEX();
  WinNT.OSVERSIONINFO osvi = new WinNT.OSVERSIONINFO();
  WinBase.SYSTEM_INFO si = new WinBase.SYSTEM_INFO();
  String major = "", sub = "";
  boolean bOsVersionInfoEx = Kernel32.INSTANCE.GetVersionExA(osviex);
  boolean bOsVersionInfo = Kernel32.INSTANCE.GetVersionExA(osvi);
  Kernel32.INSTANCE.GetSystemInfo(si);

  // If I declare newly (the old methods), these will not work fine (Bad result)!!! 
  System.out.println("osviex.dwPlatformId.intValue()"+osviex.dwPlatformId.intValue());
  System.out.println("osviex.dwMajorVersion.intValue()"+osviex.dwMajorVersion.intValue());
  System.out.println("osvi.dwPlatformId.intValue()"+osvi.dwPlatformId.intValue());
  System.out.println("osvi.dwMajorVersion.intValue()"+osvi.dwMajorVersion.intValue());

我需要这种方法的结果!

  IntByReference dwType = new IntByReference();
  Kernel32.INSTANCE.GetProductInfo(6,0,0,0,dwType);
  switch (dwType.getValue()) {
  //... code
  }

如何将Kernerl32包含新方法(已在JNA中定义-> com.sun.jna.platform.win32.Kernel32)?

解决方法:

这是您扩展由JNA平台映射定义的库的方式:

public interface Kernel32 extends com.sun.jna.platform.win32.Kernel32 {
    Kernel32 INSTANCE = (Kernel32)Native.loadLibrary("kernel32", Kernel32.class, com.sun.jna.win32.W32APIOptions.DEFAULT_OPTIONS);

    boolean GetProductInfo(int dwOSMajorVersion, int dwOSMinorVersion, int dwSpMajorVersion, int dwSpMinorVersion, IntByReference pdwReturnedProductType);
}

标签:jna,java,methods,insert,kernel32
来源: https://codeday.me/bug/20191013/1908056.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有