JNI



JNI(Java Native Interface)とは

Java言語で開発されたプログラムから、他の言語で開発されたネイティブコード(特定のプラットフォームでそのまま実行可能なプログラム)のプログラムを利用するためのAPIとなります。

C/C++言語などで実装された既存のライブラリを利用できること、パフォーマンスを向上できるなどの利点があります。


メモリ管理について

Javaでは不要となったメモリはガベージコレクションによって自動的に解放されます。

しかし、C/C++で記述した処理は、通常のC/C++プログラミングと同様に、明示的にメモリの確保と解放を適切に行う必要があります。

JNIでは、Javaによって確保されたメモリをC/C++からアクセスする場合にはメモリの確保と解放を実施するといったケースも発生します。


JNI注意点

変数の型

JavaとC/C++で変数の受け渡しを行う場合、JNI規約に合わせた変数型宣言を行う必要があります。

Javaのプリミティブ型(intやstringなどプログラミング言語によって提供されるデータ型)をC/C++で扱う場合には、Javaでの型名の先頭に「j」文字をつけた型宣言を行います。

Javaの「int」型はJNIでは「jint」型となり、「string」型は「jstring」型になります。


シグネチャ(署名)

JNIでは、シグネチャという型表示の方法があります。

シグネチャは一意のメソッドを識別するための表記法であり、メソッド名、引数、戻り値を指定して記述します。

シグネチャは、メソッドの引数リストと戻り値の型を記述した文字列で指定します。

(引数型のリスト)戻り値の型

既存クラスのシグネチャを調べる方法としてjavapコマンドが利用できます.

$ javap -s <クラスパス>

メソッド定義

JNIを利用してC言語のメソッド(関数)を呼び出す場合には、呼び出し元のJava言語ソースコードと呼び出し対象C言語ソースコードでJNI規定に従って定義する必要があります。


C言語からJava言語のクラスやメソッドを呼び出すには「リフレクション」を利用します。

リフレクションでは、コンパイル時ではなくプログラム実行時に呼び出すことができます。


配列について

C言語では配列は連続したメモリアドレスが割り当てられますが、Javaではメモリアドレスが不定です。

Javaの配列をC言語で扱うためには、GetIntArrayElements()関数で変換処理を行う必要があります。


関連





スポンサード リンク