JNAでWindowsのAPIを呼び出してみる

JNAを使ってWindowsAPIを呼び出すサンプルを書いてみました。

GitHub - java-native-access/jna: Java Native Access

ひとまず簡単なサンプルというところで、以下のAPIを呼び出す感じにしています。

GetLastError 関数
SetLastError 関数
FormatMessage 関数


・Kernel32Test.java

package com.example.jna;

import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Pointer;
import com.sun.jna.platform.win32.WinBase;
import com.sun.jna.ptr.PointerByReference;

public class Kernel32Test {

	public interface Kernel32 extends Library {
		Kernel32 INSTANCE = (Kernel32) Native.loadLibrary("kernel32", Kernel32.class);

		int GetLastError();

		void SetLastError(int dwErrorCode);

		int FormatMessageW(int dwFlags, Pointer lpSource, int dwMessageId, int dwLanguageId,
				PointerByReference lpBuffer, int nSize, Pointer va_list);

		Pointer LocalFree(Pointer hMem);
	}

	public static void main(String[] args) {
		try {
			test(0);
			test(1);
			test(2);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	private static void test(int errorCode) throws Exception {
		Kernel32.INSTANCE.SetLastError(errorCode);
		int e1 = Kernel32.INSTANCE.GetLastError();
		PointerByReference buffer = new PointerByReference();
		int len = Kernel32.INSTANCE.FormatMessageW(WinBase.FORMAT_MESSAGE_ALLOCATE_BUFFER
				| WinBase.FORMAT_MESSAGE_FROM_SYSTEM | WinBase.FORMAT_MESSAGE_IGNORE_INSERTS, null, e1, 0, buffer, 0,
				null);
		if (len == 0) {
			throw new Exception("FormatMessage Error");
		}
		Pointer ptr = buffer.getValue();
		try {
			String s = ptr.getWideString(0);
			System.out.println("errorCode=" + e1 + " Message=" + s);
		} finally {
			Pointer res = Kernel32.INSTANCE.LocalFree(ptr);
			if (res != null)
				throw new Exception("LocalFree Error errorCode=" + Kernel32.INSTANCE.GetLastError());
		}
	}
}


・実行結果

errorCode=0 Message=この操作を正しく終了しました。

errorCode=1 Message=ファンクションが間違っています。

errorCode=2 Message=指定されたファイルが見つかりません。


型のマッピングがややこしいので、そのあたりはGitHubのサンプルを参考にしつつやっていこうかと思います。とりあえず Kernel32 にある API は以下にサンプルがあります。

jna/Kernel32.java at master · java-native-access/jna · GitHub
jna/Kernel32Util.java at master · java-native-access/jna · GitHub


簡単ですが、以上になります。

[環境情報]
Windows 10
Java SE 8 Update 92
JNA 4.2.2