Adding another method to JNA Class Java (Kernel32)

2020-04-21 02:05发布

I was trying to use a method from WIN32 dll, not included in JNA.

The Method is GetProductInfo

I try this in separate project and work:

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

Using..

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

But I need to use others methods implemented in 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);
  }

Working with the code:

  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());

I need the result of this method!!!

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

How I can to include a new method to Kernerl32 (already defined in JNA -> com.sun.jna.platform.win32.Kernel32)?

1条回答
我欲成王,谁敢阻挡
2楼-- · 2020-04-21 02:23

This is how you extend a library defined by JNA's platform mappings:

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);
}
查看更多
登录 后发表回答