Java ネイティブ・メソッド入門

ネイティブ・メソッドは、Pure Java™ ではプログラミングの要件を満たすことができない場合にのみ使用してください。

ネイティブ・メソッドの使用を制限し、それらを次の状況でのみ使用するようにします。
  • Pure Java では使用できないシステム機能にアクセスする場合。
  • パフォーマンスへの依存度が高く、ネイティブ実装によるメリットが大きいメソッドを実装する場合。
  • Java が別の API を呼び出すことを可能にする既存のアプリケーション・プログラミング・インターフェース (API) とインターフェースする場合。

以下の指示は、C 言語での Java Native Interface (JNI) の使用に当てはまります。 RPG 言語での JNI の使用について詳しくは、「WebSphere® Development Studio: ILE RPG プログラマーの手引き (SD88-5042-04)」の第 11 章を参照してください。

注: ネイティブ・ライブラリーまたはネイティブ・メソッド・ライブラリーという用語は、ILE ネイティブ・メソッドのコンテキストで使用される場合は、Integrated Language Environment (ILE) サービス・プログラムを指し、PASE for i ネイティブ・メソッドの コンテキストで使用される場合は、AIX® 静的または共有ライブラリーを指します。

Java ネイティブ・メソッドを作成するには、以下のステップに従ってください。

  1. Java クラスを作成し、標準の Java 言語構文を使用して、どのメソッドがネイティブ・メソッドであるかを指定します。

    クラスの静的イニシャライザーで、ネイティブ・メソッドの C インプリメンテーションを含むネイティブ・ライブラリーをロードするコードを追加 する必要があります。 ネイティブ・ライブラリーをロードするためには、System.load() または System.loadLibrary() Java メソッドを使用できます。 System.load() メソッドでは、パラメーターとしてネイティブ・ライブラリーへの絶対パスを指定し、指定されたネイティブ・ライブラリーをロードします。 System.loadLibrary() では、パラメーターとしてライブラリー名を指定し、その名前に一致するネイティブ・ライブラリーを検出して、ネイティブ・ライブラリーをロードします。 System.loadLibrary() メソッドによってネイティブ・ライブラリーの場所を探索する方法について詳しくは、ネイティブ・メソッド・ライブラリーの管理を参照してください。

    以下のライブラリー命名規則に留意する必要があります。

    • ネイティブ・メソッドが ILE ネイティブ・メソッドであり、Java コードが Sample という名前のライブラリーをロードする場合、対応する実行可能ファイルは SAMPLE という名前の ILE サービス・プログラムである必要があります。 以下は、ILE ネイティブ・ライブラリーをロードする方法を示しています。
      System.loadLibrary("Sample");
      
      System.load("/qsys.lib/mylib.lib/Sample.srvpgm");
      注: サービス・プログラムへのシンボリック・リンクを、これらの ライブラリー・ロード・メソッドで使用できます。
    • ネイティブ・メソッドが PASE for i ネイティブ・メソッドであり、Java コードが Sample という名前のライブラリーをロードする場合、対応する実行可能ファイルは libSample.a または libSample.so という名前の AIX ライブラリーである必要があります。 以下は、PASE for i ネイティブ・ライブラリーをロードする方法を示しています。
      System.loadLibrary("Sample");
      
      System.load("/somedir/libSample.so");
  2. javac ツールを使用して Java ソースをコンパイルすることにより、クラス・ファイルを作成します。
  3. javah ツールを使用して、ヘッダー・ファイル (.h) を作成します。 このヘッダー・ファイルには、ネイティブ・メソッドの実装を作成するための正確なプロトタイプが含まれます。 ヘッダー・ファイルを作成するディレクトリーは、-d オプションで指定します。
  4. ネイティブ・メソッドの C インプリメンテーション・コードを作成します。 ネイティブ・メソッドのために使用される言語および関数の詳細については、Java ネイティブ・メソッドおよびスレッドに関する考慮事項 トピックを参照してください。
    1. 前のステップで作成したヘッダー・ファイルを組み込みます。
    2. ヘッダー・ファイル内のプロトタイプと正確に一致させます。
    3. ネイティブ・メソッドが Java 仮想マシンと対話しなければならない場合は、JNI によって提供される関数を使用します。
    4. ILE ネイティブ・メソッドの場合にのみ、ストリングを Java 仮想マシンに渡す場合は、ASCII コードに変換します。 詳しくは、ILE ネイティブ・メソッドのストリングを参照してください。
  5. ネイティブ・メソッドの C インプリメンテーション・コードをネイティブ・ライブラリーにコンパイルします。
    • ILE ネイティブ・メソッドの場合、「C モジュール作成」(CRTCMOD) コマンドを使用して、ソース・ファイルをモジュール・オブジェクトにコンパイルします。 次に「サービス・プログラム作成」(CRTSRVPGM) コマンドを使用して、1 つ以上のモジュール・オブジェクトをサービス・プログラムにバインドします。 このサービス・プログラムの名前は、System.load() または System.loadLibrary() Java メソッド呼び出しの Java コードで指定した名前と同じでなければなりません。
      注: ネイティブ・メソッドのインプリメンテーション・コードは、Teraspace ストレージを使用可能にしてコンパイルする必要があります。 Teraspace およびネイティブ・メソッドについて詳しくは、Java 用 Teraspace ストレージ・モデル・ネイティブ・メソッドを参照してください。
    • PASE for i ネイティブ・メソッドの場合は、xlc または xlc_r コマンドを使用して、AIX ライブラリーをコンパイルおよびビルドします。 PASE for i のライブラリーのコンパイルおよびビルドについて詳しくは、『AIX ソースのコンパイル』のトピックを参照してください。
  6. Java コードで System.loadLibrary() 呼び出しを使用してネイティブ・ライブラリーをロードした場合は、以下のいずれかのタスクを実行します。
    • 必要なネイティブ・ライブラリー・パスのリストを LIBPATH 環境変数に組み込みます。 LIBPATH 環境変数は、QShell で、および IBM i コマンド行から変更できます。
      • Qshell コマンド・プロンプトから、次のように入力します。

        export LIBPATH=/QSYS.LIB/MYLIB.LIB
        java  myclass

      • あるいは、コマンド行から、次のように入力します。

        ADDENVVAR LIBPATH '/QSYS.LIB/MYLIB.LIB'
        JAVA  myclass

    • あるいは、java.library.path プロパティーでリストを提供します。 java.library.path プロパティーは、QShell で、および IBM i コマンド行から変更することができます。
      • Qshell コマンド・プロンプトから、次のように入力します。

        java -Djava.library.path=/QSYS.LIB/MYLIB.LIB  myclass

      • あるいは、IBM i コマンド行から、次のように入力します。

        JAVA PROP((java.library.path '/QSYS.LIB/MYLIB.LIB')) myclass

    ここで、/QSYS.LIB/MYLIB.LIB は、System.loadLibrary() 呼び出しを使用してロードするネイティブ・ライブラリーを含むパスで、myclass は Java アプリケーションの名前です。

    System.loadLibrary() メソッドによってネイティブ・ライブラリーの場所を探索する方法について詳しくは、ネイティブ・メソッド・ライブラリーの管理を参照してください。

ILE ネイティブ・メソッドの例については、例: Java 用の ILE ネイティブ・メソッドを参照してください。 PASE for i ネイティブ・メソッドの例については、例: Java 用の IBM PASE for i ネイティブ・メソッドを参照してください。