2007年4月12日木曜日

EclipseでJNIモジュールの開発をする

プログラミングTIPSではないのですが、EclipseでJNIのモジュールを開発を試みたときにプロジェクトをどう設定すればよいかという話です。要するにちょっと設定にはまったので、忘れないようにメモっておこうということです。ただし、以下の方法はベストな方法とは思ってません。とりあえず、こうやったらできましたっていう程度のものだと思ってください。ちなみにですが、Win32でEclipseとMinGWを使って開発するというお話しです(他のプラットホームでは違うところがあるかもしれません)。

蛇足かもしれませんが、JNIの開発そのものは、JDKのドキュメント(Java5のJDKのリンクですが)に載っていて、MinGWでJNIのモジュールをコンパイルするにはどうするかというのは、MinGWのFAQに書いてあります。

まずは、JNIのモジュールを開発するには、nativeの宣言を含むJavaのソースをまず書いてコンパイルする。classファイルからjavahでC(++)のヘッダーを出力して、C(++)のコードを書いてコンパイルする。出来上がったモジュールをJavaから実行させる、という手順であると思っていることが前提となります。

何が話題かというと、JavaのモジュールはJavaのプロジェクトで開発して、JNIのモジュールはCDTを使って、C(++)のプロジェクトで開発するのですが、javahで作られるヘッダーをどうやって、C(++)のプロジェクトへもってくるか、できたモジュールをどこにコピーして、実行するかということです。

C(++)のプロジェクトのほうがビルドの設定の自由度が高いと踏んで、C(++)のプロジェクト側でがんばるということにします。依存関係としては、C(++)のプロジェクトがJavaのプロジェクトを参照しているというふうにします(お互いに参照していてもよいとは思います)。

C(++)のプロジェクトの設定で「C/C++ビルド」という項目の中に、ビルドステップというのあって、ここにビルドの前後に何かコマンドが実行できるので、これを利用することにします。 まずは、javahをビルド前に実行するためにビルド前のステップのところに以下のように入力します。

<JDKのフルパス>\bin\javah -jni -d .. -classpath ../../<Javaのプロジェクト名> <パッケージ名>.<クラス名>

※もし、「\」がバックスラッシュに見えたら、「¥」の半角だと思ってください このとき、 「<パッケージ名>.<クラス名>」は、複数記述することができます。

これで、JavaのプロジェクトからJNIのモジュールを読み込んで実行できるわけです(もちろん、何かバグってたらだめですが…)。デバッグや実行もEclipseからやりたいので、「構成および実行」の設定をして、Javaを実行させればよいのですが、JNIのモジュールがjava.library.pathにないと実行できません。 そのときにどうするかというと、JNIモジュールを読み込むjavahを実行したJavaプロジェクトとは別に、これらを使うJavaプロジェクトを作成します。 この新しいほうのプロジェクトのビルドの構成の「プロジェクト(P)」でJNIのJavaプロジェクトを参照するように設定すれば、実行できます。この設定に「ネイティブ・ライブラリーのロケーション」というサブツリーがあると思いますが、ここでJNIのネイティブモジュール(Win32だとDLL)のパスを設定すればよいです。

リリースしたときにjava.library.pathの設定をどうするのかというところは気になるところですが、VMの実行時にパラメタで渡さなくても、いわゆるpath変数で見つけられるところにモジュールがあれば実行できるようです。

0 件のコメント: