Tech Sketch Bucket of Technical Chips by TIS Inc.

javaでwindowsのdllを利用する

Pocket

JNAを利用することでJAVAでWindowsのdllを手軽に利用できます。JAVAでwindowsのdllを利用するメリットってあるのでしょうか?
時代遅れとなったwindowsのシステムをマイグレーションする際、フルスクラッチで開発するのも選択肢ですが、JNAを使うことでWindowsのdllを再利用してJAVAへ移行できます。それ以外にもOSの機能をJAVAから利用できるようになります。


JNAとは

JAVAからネイティブの共有ライブラリにアクセスする方法を提供するライブラリです。少ないコーディング量で簡単にネイティブの共有ライブラリにアクセスできます。 JNA https://github.com/twall/jna

JNAの使用例

JNAを使えばWindowsAPIのメッセージボックスも数行のコーディングで表示できます。しかし、JNAを利用するにはWindowsAPIとJNAの仕様を知ることが必要です。
まずはMessageBoxAの実装について説明したいと思います。

MessageBoxAの仕様を調べる

調べ方は色々ありますが、例えば下のどれかの方法でネイティブの宣言を知ることができます。

調べた結果が下になります。

JNAのデータ型へ変更する

MessageBoxAの定義が判りましたが、このままJAVAへ記述しても利用できないのでJAVAで使える定義に変更します。

型変換パターン

ネイティブの型がデータ型かポインタ型、それとサイズによってJNAで使う型を適切に選択する必要があります。

Native Type Size Java Type Common Windows Types
char 8-bit integer byte BYTE, TCHAR
short 16-bit integer short WORD
wchar_t 16/32-bit character char TCHAR
int 32-bit integer int DWORD, UINT
int boolean value boolean BOOL
long 32/64-bit integer NativeLong LONG
long long 64-bit integer long __int64
float 32-bit FP float  
double 64-bit FP double  
char* C string String LPTCSTR
void* pointer Pointer LPVOID, HANDLE, LPXXX
HWND Handle Window int HANDLE

JNAでは下のようになります。

調べた結果を元にJNAを使ったJAVAのコードを記述する

WindowsAPIをJNAにマッピングできる準備ができたのでコーディングすると下のようになります。

自動マッピングツール

今回は手動で記述しましたが関数の量が多くなるとJNAのマッピングは大変な作業になります。
しかし、 JNAerator を利用すると自動でJAVAのコードが生成でき、手動でマッピングするよりも効率的なマッピングが可能です。

最後に

JNAを使ったWindowsAPIについての説明を終わります。次回は構造体について説明したいと思います。

エンジニア採用中!私たちと一緒に働いてみませんか?