2012年7月5日木曜日

JNIお急ぎ作成レシピ

JNIる


こんにちは。イチ、プログラマのyu1rowです。
JavaでOSネイティブの機能を使用する際に使用するJNIってものがあります。
何それウマイの?って人は立ち去って頂いても結構です。

JNIは使おうとするとやり方を忘れちゃったりしてたりするんで、足がかりになるくらいの備忘録を残しておきます。

前提条件として必要な環境


OSWindows
(今回はWindows 7 Professional x86を使用)
IDE(Java)Eclipse
(今回は3.6 Helios SR2 x86を使用)
IDE(C/C++)Visual Studio
(今回は2005 Professionalを使用)
JDK今回はjdk1.6.0_24を使用
環境変数上記JDKにパスが通っていること
(上記のデフォルトならC:\Program Files\Java\jdk1.6.0_24\bin;とか)

それでは、以下つらつらと流れを書いていきます

Step 1 : JNI呼出用クラスの作成~ヘッダファイルの生成


まずはEclipseを起動してクラスを作成します。

今回はクラス名を"JniSample"としています。
後でDLLを作成するとして、DLL名称は"JniSampleImpl.dll"とでもしましょうか。
int型の引数を渡せる戻り値voidの"ExecSample"というメソッドを作ることにします。
ソースコードのダウンロード

classファイルからヘッダファイルを生成します。
コマンドプロンプトを起動してeclipseで使用しているworkspaceの中の、作成したプロジェクトのフォルダの中にbinフォルダがあると思いますので、このフォルダに移動します。
ここでjavahコマンドに-jniオプション、先ほど作成したクラスの装飾名をフルで指定するとヘッダファイルが作成されるはずです。
前述のとおり、環境変数でJDKのインストール先にパスを指定していないとjavahコマンドが失敗します。

コマンドが成功するとこんな風にhファイルができているはずです。

Step 2 : DLLの作成 - プロジェクトの作成~ヘッダファイルの追加


Visual Studioを起動して新しいプロジェクトを作成します。
今回は"JniSampleImpl"という名前でWin32プロジェクトを作成しました。
アプリケーション設定で、「アプリケーションの種類」を「DLL」に、「追加のオプション」で「空のプロジェクト」を指定します。

プロジェクトのフォルダが作成されるので、Step 1で生成されたヘッダファイルをココへ移動します。
フォルダに移動したヘッダファイルをプロジェクトに追加します。

Step 3 : DLLの作成 - ネイティブコードの実装


実装を行うため、cppファイルを作成します。
今回は"JniSampleImpl.cpp"という名前でファイルを追加しました。

cppファイルでは生成したヘッダファイルのインクルードを記述し、ヘッダファイルの定義に従って関数を記述します。
以下の例では引数に1が渡されたらメッセージボックスを表示するように実装しています。
ソースコードのダウンロード

Step 4 : DLLの作成 - JNI用ヘッダファイルのインクルードパス設定


※Visual Studioで1度設定しておけば以後はもう一度行う必要はありません
JDKをインストールしたフォルダのincludeフォルダと、さらにその中のwin32フォルダをインクルードする対象のフォルダに設定しておきます。
「ツール」メニューの「オプション」で開くダイアログから「プロジェクトおよびソリューション」の「VC++ディレクトリ」を選択すると設定を行う画面になります。
ここで2つのフォルダを追加しておきます。

Step 5 : DLLの作成 - ビルド前の設定~ビルド


プロジェクトの設定でランタイムライブラリの設定を行っておきます。
共通DLL設定でDLLを作成した場合、作成されるDLLのファイルは小さなサイズにすることができますが、ランタイムライブラリがインストールされていない環境では実行することができません。
設定を変更してランタイムライブラリをDLLに埋め込むようにしておきます。
左側のペインの「構成プロパティ」→「C/C++」→「コード生成」を選択し、右側の「ランタイムライブラリ」で「マルチスレッドDLL(/MD)」を「マルチスレッド(/MT)」に変更します。
※Debugの場合、「マルチスレッドデバッグDLL(/MDd)」を「マルチスレッドデバッグ(/MTd)」に変更します
設定が完了したら「ソリューションのビルド」を行います。
正常終了した場合、"JniSampleImpl.dll"が出来上がるはずです。

Step 6 : EclipseでのDLL指定~実行


Eclipseに戻り、先ほど作成したDLLをプロジェクトにインポートします。

「実行構成」からDLLを追加した場所を環境変数に追加します。
「実行」をクリックでアプリケーションが開始されます。
うまくいけば先ほどのDLLが呼び出され、ダイアログが表示されるはずです。


お疲れ様でした


手順は以上となります。
ねっ?簡単でしょ!?とまでは言いませんが、慣れれば何てことはないと思います。

0 件のコメント:

コメントを投稿