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

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

完全な PL/I プログラムは、図 30 に示してあります。このサンプル PL/I プログラムは、JNI を介していくつかの呼び出しを 行います。

開始時に、呼び出し側 Java オブジェクト myObject への 参照が PL/I プロシージャーに渡されます。PL/I プログラムはこの参照を使用して、呼び出し側からの情報を 取得します。最初の情報は、GetObjectClass JNI 関数を使用して 検索される呼び出し側オブジェクトのクラスです。このクラス値は、対象となる Java オブジェクト内の Java ストリング・ フィールドの ID を取得するために、GetFieldID JNI 関数に よって使用されます。この Java フィールドは、フィールド名 myString、および JNI フィールド 記述子 Ljava/lang/String; (フィールドが Java ストリング・ フィールドであることを示す) の指定によってさらに詳細に識別されます。その後、Java ストリング・フィールドの値が GetObjectField JNI 関数を使用して検索されます。PL/I が Java ストリング値を 使用するには、事前にこの値をアンパックして PL/I が解釈できる形式に する必要があります。GetStringUTFChars JNI 関数を使用して、Java ストリングが PL/I varyingz ストリングに変換され、このストリングが PL/I プログラムによって表示されます。

取得した Java ストリングを表示した後、PL/I プログラムは、呼び出し側 Java オブジェクト内のストリング・フィールドの更新に使用 する PL/I ストリングの入力をユーザーに促します。PL/I ストリングの値は、NewString JNI 関数を使用 して Java ストリングに変換されます。この新しい Java ストリングを使用して、SetObjectField JNI 関数 によって呼び出し側 Java オブジェクト内のストリング・フィールドが 更新されます。

PL/I プログラムが終了すると Java に制御が戻され、新しく更新された Java ストリングが Java プログラムによって表示されます。

図 30. PL/I サンプル・プログラム #2 - ストリングの引き渡し
 *Process Limits( Extname( 31 ) ) Margins( 1, 100 ) ;
 *Process Dllinit xinfo(def);
 *Process Default( IEEE );
 plijava_demo: package exports(*);

  Java_passString_pliShowString:
  Proc( JNIEnv , myJObject )
    external( "_Java_jPassString_pliShowString" )
    options( byvalue nodescriptor linkage(stdcall) );

   %include jni;

   Dcl myBool           Type jBoolean;
   Dcl myClazz          Type jClass;
   Dcl myFID            Type jFieldID;
   Dcl myJObject        Type jObject;
   Dcl myJString        Type jString;
   Dcl newJString       Type jString;
   Dcl myID             Char(9)   Varz static init( 'myString' );
   Dcl mySig            Char(18)  Varz static
                        init( 'Ljava/lang/String;' );
   Dcl pliStr           Char(132) Varz Based(pliStrPtr);
   Dcl pliReply         Char(132) Varz;
   Dcl pliStrPtr        Pointer;
   Dcl nullPtr          Pointer;

   Display('  ');

   /* Get information about the calling Class              */
   myClazz = GetObjectClass(JNIEnv, myJObject);

   /* Get Field ID for String field from Java              */
   myFID = GetFieldID(JNIEnv, myClazz, myID, mySig );

   /* Get the Java String in the string field              */
   myJString = GetObjectField(JNIEnv, myJObject, myFID );

   /* Convert the Java String to a PL/I string             */
   pliStrPtr = GetStringUTFChars(JNIEnv, myJString, myBool );

   Display('From  PLI: String retrieved from Java is: ' || pliStr );
   Display('From  PLI: Enter a string to be returned to Java:' )
          reply(pliReply);

   /* Convert the new PL/I string to a Java String         */
   newJString = NewString(JNIEnv, trim(pliReply), length(pliReply) );

   /* Change the Java String field to the new string value */
   nullPtr = SetObjectField(JNIEnv, myJObject, myFID, newJString);

  End;

 end;

Terms of use | Feedback

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