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

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

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

以下の説明は、C 言語での Java Native Interface (JNI) の使用に適用されます。 RPG 言語での JNI の使用については、「 WebSphere® Development Studio: ILE RPG プログラマーの手引き」( SC09-2507) の第 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 storage model native methods for Javaを参照してください。
    • 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 ネイティブ・メソッドの例については、 例: ILE ネイティブ・メソッド (Java 用)を参照してください。 PASE for i ネイティブ・メソッドの例については、 例: IBM PASE for i native method for Javaを参照してください。