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)?
This is how you extend a library defined by JNA's platform mappings: