What is the easiest way to call a Windows kernel function from Java? What is the easiest way to call a Windows kernel function from Java? windows windows

What is the easiest way to call a Windows kernel function from Java?


If you go with JNA, consider invoking MoveFileW directly - it saves having to provide configuration info to choose between Unicode and ANSI calls.

import java.io.*;import com.sun.jna.*;public class Ren {  static interface Kernel32 extends Library {    public static Kernel32 INSTANCE = (Kernel32) Native        .loadLibrary("Kernel32", Kernel32.class);    public static int FORMAT_MESSAGE_FROM_SYSTEM = 4096;    public static int FORMAT_MESSAGE_IGNORE_INSERTS = 512;    public boolean MoveFileW(WString lpExistingFileName,        WString lpNewFileName);    public int GetLastError();    public int FormatMessageW(int dwFlags,        Pointer lpSource, int dwMessageId,        int dwLanguageId, char[] lpBuffer, int nSize,        Pointer Arguments);  }  public static String getLastError() {    int dwMessageId = Kernel32.INSTANCE.GetLastError();    char[] lpBuffer = new char[1024];    int lenW = Kernel32.INSTANCE.FormatMessageW(        Kernel32.FORMAT_MESSAGE_FROM_SYSTEM            | Kernel32.FORMAT_MESSAGE_IGNORE_INSERTS, null,        dwMessageId, 0, lpBuffer, lpBuffer.length, null);    return new String(lpBuffer, 0, lenW);  }  public static void main(String[] args) throws IOException {    String from = ".\\from.txt";    String to = ".\\to.txt";    new FileOutputStream(from).close();    if (!Kernel32.INSTANCE.MoveFileW(new WString(from),        new WString(to))) {      throw new IOException(getLastError());    }  }}

EDIT: I've edited my answer after checking the code - I was mistaken about using char[] in the signature - it is better to use WString.


If this is really necessary (renameTo doesn't work and you're sure MoveFile will), I would use JNA. It looks like most of the work is already done in com.mucommander.file.util.Kernel32.java/Kernel32API.java.


Based on the NativeCall library I did the following POC Application.

It uses the MoveFileA function from kernel32.dll

It comes as complete working sample with a run.bat and all jar and dlls in place.

It moves the included test.txt to test2.txt


If you don't like the NativeCall library version I did another POC Application based on/resuing on the Java Native Access (JNA) library. This time MoveFileA and MoveFileW are implemented and demonstrated.