イントロダクション
The nAG C LibraryとnAG Fortran Libraryはパッケージの作成に有用な数多くの科学技術・統計計算ルーチンを含んでいます。(線形代数、最適化、求積、微分方程式、回帰分析、時系列解析等) これらのライブラリはCもしくはFortranで書かれていますが、他の言語や環境からも利用可能です。特にDLL版のnAG Cライブラリと nAG Fotranライブラリは特にさまざまな利用方法が考えられます。
ここではJavaからDLL版のnAG C ライブラリとnAG Fortranライブラリを呼び出すことについて説明します。
数値計算が求められるプログラムを行う場合に、1つの方法としてそれを行うためのJavaクラスを実装することが考えられますが ここではnAG数値計算ライブラリをJavaから呼び出す方法を考えます。この方法では既に存在するコードを利用しますので 新たに計算ルーチンを作成する、もしくは既存の他の言語のルーチンをコンバートする必要がないというメリットが生じます。 更にJavaが中間コードを介して動作するため、FortranやCで作成された計算ルーチンを利用すると、パフォーマンス面で優れるというメリットも生じます。
JNI(Java Native Interface)
DLL版のnAG C ライブラリもしくはnAG FortranライブラリをJavaから呼び出すために、ここではJNI(Java Native Interface)を利用します。
JNIはJava開発キット(SDK)に含まれています。JNIではJavaデータタイプをCのデータタイプに対応させるための方法が定義されています。CプログラムはJNIヘッダファイルからこの情報を得ることができます。またSDKに付属しているツール「javah」を用いて、CとJavaの橋渡しを行うためのヘッダファイル(各ユーザアプリケーション特有のもの)を生成することができます。 実行時にJNIはJavaオブジェクトをCへ渡せるようにし、CがJavaのプロパティーやメソッドにアクセスできるようにします。 例えばCコードの中からJavaクラスのプロパティーの設定を行ったり、Javaメソッドを呼び出したりすることが可能です。
JNIを利用したnAGライブラリの利用方法
JNIを利用してnAGライブラリを呼び出すためには、JavaとCの中間インターフェースの役割をする共有ライブラリを作成する必要があります。これはCの関数がJavaから呼び出される際に、追加引数があわせて渡されてくるからです。これらの追加引数によりCからJavaオブジェクトがアクセスできるわけなのですが、nAGライブラリ事態はこのような追加引数を受ける設計になっていないため、中間インターフェース共有ライブラリが必要となります。
nAGライブラリをJavaから呼び出すためには以下の3つのステップが必要です。
- ネイティブ(C等)関数の宣言をJavaで書く。 この宣言はキーワード「native」を含みJavaコンパイラが外部ルーチンであることを認識できるようにします。
- ネイティブCコードで利用できるヘッダファイルを用意します。このヘッダファイルではCコンパイラからみたネイティブメソッド(追加引数を含み、Cのデータタイプで記述されている)を記述します。
- ネイティブメソッドを実装します。この関数は上記で作成したヘッダファイルを利用し、内部でnAGライブラリルーチン(FortranまたはC)を呼び出すように記述します。
より詳細な情報は以下のURLをご参照ください:
http://www.nag-j.co.jp/naglib/tr/java/index.htm