JavaでJNIを使ってみる(1)

JavaでJNIを使ってみる(1)

JavaJavaでJNIを使ってみる(1)

ふと、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 それぞれでビルド方法も違うので苦労しました・・・。

最終更新日:

関連記事

人気記事

新着情報