Tech Sketch Bucket of Technical Chips by TIS Inc.

javaでwindowsのdllを利用する(構造体を引数とするAPI)

Pocket

前回 紹介したJNAeratorを使って構造体をJAVAのコードへ変換して、構造体が引数のWindowsAPIをJAVAで利用してみます。


利用するWindowsAPI

例としてWindowsのバージョンを取得するAPIで説明します。
・構造体

・WindowsAPI

http://msdn.microsoft.com/ja-jp/library/cc429835.aspx

JNAeratorを使って構造体を変換

構造体をJAVAで利用するにはJNAのStructureクラスを継承しgetFieldOrderを実装、
DWORDをJAVAで使える適切な型に変更するなど面倒な作業が発生します。
そこで面倒な作業を自動化してくれるJNAeratorを使います。
下のページからJNAeratorをダウンロードして起動してください。

http://code.google.com/p/jnaerator/

・JNAeratorの使い方

1. Target Runtime JNA を選択
2. Library Name 任意の名前を入力(パッケージ名になります)
3. Output Mode Standalone Jarを選択
4.オプションを指定 No CommentsStructs as Top-Level classes のみにチェックを入れる
jna2.png

5.上又は左のペインにC言語の構造体を貼り付ける
6. JNAerate! ボタンを押す
7.下又は右のペインにJAVAのコードが出力される
jna3.png

8.出力されたJAVAのコードをそのまま使うとコンパイルエラーが出力されるので修正する
 ・JNAが対応していない型を変更(TCHARをbyteに変更)
 ・Structureクラスを継承する場合はgetFieldOrderの実装が必要
 ・initFieldOrderは使用すべきでないから消す
*最新バージョンではgetFieldOrderとinitFieldOrderについて対応されているようです

JNAeratorはコマンドラインからも利用可能です。
オプションの一部を挙げました。

出力先   -o ディレクトリ
パッケージ名 -package パッケージ名
コメント無し -noComments
出力方法 -mode Jar | StandaloneJar | Directory | Maven | AutoGeneratedMaven
ランタイム -runtime JNA | JNAerator (based on JNA) | BridJ (faster runtime that supports C++)
出力クラス名 -library クラス名

オプションの詳細については下のURLを参照ください。
http://code.google.com/p/jnaerator/wiki/CommandLineOptionsAndEnvironmentVariables

構造体を引数とするAPIの使い方

APIの引数がポインタ型(LPOSVERSIONINFO)の場合でも
Pointerクラスに変更する必要は無く、そのまま構造体クラスを引数として使います。

実行結果

APIの実行が成功してMajorVersionが表示されました。
jna4.png

まとめ

単純な例で説明しましたが構造体の要素が大量、構造体の中に構造体やポインタがあるなど
構造体が複雑な場合に手作業でコーディングすると間違いが多発して修正するのに時間がかかりますが、
JNAeratorを使うことで複雑なコーディングの手間を省けます。
JNAだけでも強力ですがJNAeratorを組み合わせて利用することでさらに強力になり、
JNI だけでプログラムするよりもコーディング量を減らして効率的な開発が可能になります。

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