最初のサンプル・プログラムは、"Hello World!" プログラム の一種です。
"Hello World!" プログラムには、1 つの Java クラス callingPLI.java があります。PL/I で書かれたネイティブ・メソッドは、hiFromPLI.pli に含まれています。このサンプル・プログラムを作成するための手順を簡単に概説します。
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 が作成されます。
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!");
}
}
Java コンパイラーを使用して callingPLI クラスをコンパイルし、 実行可能形式にします。コマンドは次のとおりです。
javac callingPLI.java
ネイティブ・メソッドの PL/I インプリメンテーションは、 他の PL/I サブルーチンとほぼ同じようなものです。
サンプル・プログラムには、重要なコンパイラー・オプションを定義する 一連の *PROCESS ステートメントが含まれています。
*Process Limits( Extname( 100 ) ) Margins( 1, 100 ) ; *Process Display(Std) Dllinit Extrn(Short); *Process Rent Default( ASCII IEEE );
次に、これらのオプションの概要と利点を説明します。
IEEE は、FLOAT データを IEEE フォーマット (JAVA で の保持形式) で保持するように指定します。
PL/I プロシージャー名は、実行時に Java クラス・ローダーによって 検出されるために、Java 命名規則に準拠している必要があります。 Java 命名体系は 3 つの部分で構成されます。 最初の部分は Java 環境に対してルーチンを識別し、 2 番目の部分はネイティブ・メソッドを定義する Java クラスの名前、 3 番目の部分はネイティブ・メソッド自体の名前です。
次に、サンプル・プログラムにある PL/I プロシージャー 名 Java_callingPLI_callToPLI を分解して説明します。
また、PROCEDURE ステートメントの OPTIONS オプションに、以下のオプションを指定する必要があります。
サンプル・プログラムの完全なプロシージャー・ステートメントは、 次のとおりです。
Java_callingPLI_callToPLI:
Proc( JNIEnv , MyJObject )
External( "Java_callingPLI_callToPLI" )
Options( FromAlien NoDescriptor ByValue );
Java ネイティブ・インターフェースの PL/I 定義を含む 2 つの PL/I インクルード・ファイルは、ibmzjni.inc およびこれにインクルードされる ibmzjnim.inc です。これらのインクルード・ファイルは以下のステートメントでインクルードされます。
%include ibmzjni;
ibmzjni および ibmzjnim インクルード・ファイルは、 PL/I SIBMZSAM データ・セットの中に提供されています。
最後にまとめとして、ネイティブ・メソッドを定義する 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;
次のコマンドを使用して、PL/I サンプル・プログラムをコンパイルします。
pli -c hiFromPLI.pli
次のコマンドを使用して、生成された PL/I オブジェクト・デックを 共用ライブラリーにリンクします。
c89 -o libhiFromPLI.so hiFromPLI.o
PL/I 共用ライブラリーの名前には必ず lib 接頭部を 付けてください。そうしないと、Java クラス・ローダーはライブラリーを 検出できません。