JNAでWindowsのAPIを呼び出してみる
JNAを使ってWindowsのAPIを呼び出すサンプルを書いてみました。
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