JavaでJNIを使ってみる(1)
※実経験の記憶を頼りに自宅の PC 環境(VMWareなど)で再現している内容もあるのでご注意下さい
2007-11-12
ふと、Java からネイティブコードの呼び出し方法を調べてみました。今回はネイティブコードとして、Windows の DLL、Linux の so、Mac の jnilib を Call する方法を調査してみます。
Java には標準で JNI(Java Native Interface)という機能があり、Java で開発されたプログラムから、他の言語で開発されたネイティブコードを利用するための API として利用できます。
開発環境は以下の通りで、dll は Windows じゃないですが、Cygwin 上で作成することにしました。boland の C++ はユーザー登録が面倒なのでやめました。
Eclipse3.2.0(ビルドはAntを使用) jdk1.5.0_13 Cygwin(gcc) Linux(gcc) MacOS(gcc)
まずは、ネイティブメソッドを含む Java プログラムを作成してコンパイルします。今回は Ant で定義しましたが、コマンドラインでビルドするときは下記のようにします。
$ javac sample.java
次に、生成されたクラスファイルからヘッダファイルを作成します。こちらも、コマンドラインでの生成方法を書いておきます。
$ javah -jni [クラスファイル名(.classは不要)]
上記で生成したヘッダファイルを参照して C++ のプログラムを作成します。今回は、クラス名が sample、Java のネイティブメソッドを getWord とします。
[ネイティブ関数の定義]
JNIEXPORT jstring JNICALL Java_sample_getWord
(JNIEnv *env, jobject obj, jstring str1, jstring str2 ) {
[ネイティブ関数の命名規約]
Java_[パッケージ名]_[クラスファイル名]_[ネイティブ関数名]
引数は、左から
[JNI インタフェースポインタ(JNIEnv型)] すべての JNI 関数のポインタを格納する構造体を指すポインタ [オブジェクトの参照] static のネイティブメソッドの場合は、Java クラスの参照 [Java 側で指定した引数(1番目)] ネイティブ型 [Java 側で指定した引数(2番目)] ネイティブ型
最後に、作成した C++ プログラムから共有ライブラリを作成します。so や jnilib ファイルは、ファイル名の先頭に lib を付けます。
[dll] sample.dll [so] libsample.so [jnilib] libsample.jnilib
次回は、Java や C++ のソースも交えて、それぞれのプラットフォームでのライブラリの作成方法をまとめたいと思います。Cygwin, Linux, MacOS それぞれでビルド方法も違うので苦労しました・・・。
関連記事
上記の記事に関連する記事(最新の10件)です。


