Rational Developer for System z
Enterprise PL/I for z/OS, Version 3.8, プログラミング・ガイド

Java サンプル・プログラム #1 の作成

最初のサンプル・プログラムは、"Hello World!" プログラム の一種です。

"Hello World!" プログラムには、1 つの Java クラス callingPLI.java があります。PL/I で書かれたネイティブ・メソッドは、hiFromPLI.pli に含まれています。このサンプル・プログラムを作成するための手順を簡単に概説します。

  1. ネイティブ・メソッドを含むクラスを定義し、ネイティブ・ロード・ライブラリー をロードし、ネイティブ・メソッドを呼び出す Java プログラムを作成する。
  2. Java プログラムをコンパイルして Java クラスを作成する。
  3. ネイティブ・メソッドをインプリメントして "Hello!" テキストを表示 する PL/I プログラムを作成する。
  4. PL/I プログラムをコンパイルしてリンクする。
  5. PL/I プログラム内のネイティブ・メソッドを呼び出す Java プログラム を実行する。

ステップ 1: Java プログラムの作成

ネイティブ・メソッドの宣言

Java メソッドであるかネイティブ・メソッドであるかに関係なく、 メソッドはすべて Java クラス内で宣言する必要があります。 Java メソッドとネイティブ・メソッドの宣言の違いは、 キーワード native だけです。 native キーワードは、このメソッドのインプリメンテーション のある場所が、プログラムの実行時にロードされるネイティブ・ライブラリー内 であることを Java に指示します。 ネイティブ・メソッドの宣言は、次のとおりです。

public native void callToPLI();

上記のステートメントの中で、void はこのネイティブ・メソッド呼び出し から予期される戻り値がないことを示しています。 メソッド名 callToPLI( ) の空括弧は、 ネイティブ・メソッドの呼び出し時に渡すパラメーターがないことを 示しています。

ネイティブ・ライブラリーのロード

ネイティブ・ライブラリーが実行時にロードされるように、 ネイティブ・ライブラリーをロードするステップを組み込む必要があります。 ネイティブ・ライブラリーをロードする Java ステートメントは、 次のとおりです。

 static {
   System.loadLibrary("hiFromPLI");
 }

上記のステートメントでは、ネイティブ・ライブラリーを検索して ロードするために、Java システム・メソッド System.loadLibrary(...) が 呼び出されています。 PL/I プログラムをコンパイルしてリンクするステップの実行中に、 PL/I 共用ライブラリー libhiFromPLI.so が作成されます。

Java main メソッドの作成

callingPLI クラスには、クラスのインスタンスを生成して ネイティブ・メソッドを呼び出す main メソッドも含まれ ています。 main メソッドは callingPLI のインスタンスを生成し、 callToPLI() ネイティブ・メソッドを呼び出します。

このセクションで前述した点をすべて含む callingPLI クラスの 完全な定義は、次のとおりです。

 public class callingPLI {
   public native void callToPLI();
   static {
      System.loadLibrary("hiFromPLI");
   }
   public static void main(String[] argv) {
      callingPLI callPLI = new callingPLI();
      callPLI.callToPLI();
      System.out.println("And Hello from Java, too!");
   }
 }

ステップ 2: Java プログラムのコンパイル

Java コンパイラーを使用して callingPLI クラスをコンパイルし、 実行可能形式にします。コマンドは次のとおりです。

javac callingPLI.java

ステップ 3: PL/I プログラムの作成

ネイティブ・メソッドの PL/I インプリメンテーションは、 他の PL/I サブルーチンとほぼ同じようなものです。

便利な PL/I コンパイラー・オプション

サンプル・プログラムには、重要なコンパイラー・オプションを定義する 一連の *PROCESS ステートメントが含まれています。

 *Process Limits( Extname( 100 ) ) Margins( 1, 100 ) ;
 *Process Display(Std) Dllinit Extrn(Short);
 *Process Rent Default( ASCII IEEE );

次に、これらのオプションの概要と利点を説明します。

Extname(100)
Java スタイルの長い外部名を許可します。
Margins(1,100)
マージンを拡張して、Java スタイルの名前と ID が入る場所を 確保します。
Display(Std)
WTO を介さずに、"Hello World" テキストを stdout に書き込みます。 z/OS UNIX 環境では、WTO はユーザーによって意識されることはありません。
Dllinit
DLL の作成に必要な初期化コードをインクルードします。
Extrn(Short)
EXTRN は、参照された定数に対してだけ発行されます。 このオプションは、Enterprise PL/I V3R3 以上で必要です。
Default( ASCII IEEE );
ASCII は、CHARACTER と PICTURE のデータを ASCII 形式 (JAVA で の保持形式) で保持するように指定します。

IEEE は、FLOAT データを IEEE フォーマット (JAVA で の保持形式) で保持するように指定します。

RENT
RENT オプションは、コードが静的変数に対して書き込みを行う場合にも、 コードの再入可能性を確保します。
PL/I プロシージャー名とプロシージャー・ステートメントの正しい形式

PL/I プロシージャー名は、実行時に Java クラス・ローダーによって 検出されるために、Java 命名規則に準拠している必要があります。 Java 命名体系は 3 つの部分で構成されます。 最初の部分は Java 環境に対してルーチンを識別し、 2 番目の部分はネイティブ・メソッドを定義する Java クラスの名前、 3 番目の部分はネイティブ・メソッド自体の名前です。

次に、サンプル・プログラムにある PL/I プロシージャー 名 Java_callingPLI_callToPLI を分解して説明します。

Java
動的ライブラリー内にあるネイティブ・メソッドはすべて、 Java を最初に指定する必要があります。
_callingPLI
ネイティブ・メソッドを宣言する Java クラスの名前。
_callToPLI
ネイティブ・メソッド自体の名前。
注:
PL/I と C の間では、ネイティブ・メソッドのコーディングに重要な 違いがあります。JDK に付属する javah ツールは、 C プログラムに必要な外部参照形式を生成します。 ネイティブ・メソッドを PL/I で書き、 前述した PL/I 外部参照の命名規則に準拠する場合は、 PL/I ネイティブ・メソッドに対して javah ステップを 実行する必要はありません。

また、PROCEDURE ステートメントの OPTIONS オプションに、以下のオプションを指定する必要があります。

サンプル・プログラムの完全なプロシージャー・ステートメントは、 次のとおりです。

  Java_callingPLI_callToPLI:
  Proc( JNIEnv , MyJObject )
    External( "Java_callingPLI_callToPLI" )
    Options( FromAlien NoDescriptor ByValue );
JNI インクルード・ファイル

Java ネイティブ・インターフェースの PL/I 定義を含む 2 つの PL/I インクルード・ファイルは、ibmzjni.inc およびこれにインクルードされる ibmzjnim.inc です。これらのインクルード・ファイルは以下のステートメントでインクルードされます。

     %include ibmzjni;

ibmzjni および ibmzjnim インクルード・ファイルは、 PL/I SIBMZSAM データ・セットの中に提供されています。

完全な PL/I プロシージャー

最後にまとめとして、ネイティブ・メソッドを定義する PL/I プログラム 全体を示します。

 *Process Limits( Extname( 100 ) ) Margins( 1, 100 ) ;
 *Process Display(Std) Dllinit Extrn(Short);
 *Process Rent Default( ASCII IEEE );
 PliJava_Demo: Package Exports(*);

  Java_callingPLI_callToPLI:
  Proc( JNIEnv , MyJObject )
    External( "Java_callingPLI_callToPLI" )
    Options( FromAlien NoDescriptor ByValue );

   %include ibmzjni;
   Dcl myJObject        Type jObject;

   Display('Hello from Enterprise PL/I!');

 End;

ステップ 4: PL/I プログラムのコンパイルとリンク

PL/I プログラムのコンパイル

次のコマンドを使用して、PL/I サンプル・プログラムをコンパイルします。

   pli -c hiFromPLI.pli
共用ライブラリーのリンク

次のコマンドを使用して、生成された PL/I オブジェクト・デックを 共用ライブラリーにリンクします。

   c89 -o libhiFromPLI.so hiFromPLI.o

PL/I 共用ライブラリーの名前には必ず lib 接頭部を 付けてください。そうしないと、Java クラス・ローダーはライブラリーを 検出できません。


Terms of use | Feedback

This information center is powered by Eclipse technology. (http://www.eclipse.org)