RPG *JAVA プロトタイプではなく JNI を使用する Java™ メソッドの呼び出し

最初の 3 つのパラメーターは、必ず次と同じになります。
  1. JNI 環境ポインター
  2. オブジェクト (インスタンス・メソッドの場合) またはクラス (静的メソッドの場合)
  3. メソッド
メソッド固有のパラメーターは、これら 3 つのパラメーターの後に、3 つの異なる方法のいずれかでコーディングされます。例えば、メソッドが値を戻さない場合 (戻りタイプは「void」)。
CallVoidMethod:
同じメソッドを何度も呼び出そうとしている場合はこの方法を選択します。 これはメソッドを非常に容易に呼び出せるからです。この方法では、パラメーターは普通に渡されることを想定しています。この JNI 機能を呼び出すには、RPG は CallVoidMethod プロトタイプを JNI/COPY ファイルからコピーして、追加のパラメーターをコーディングします。この関数は、少なくとも 1 つのパラメーターを OPTIONS(*NOPASS) を指定してコード化する必要があります。メソッド・パラメーターをオプションにしない場合は、 余分の “dummy” パラメーターを OPTIONS(*NOPASS) を指定して追加します。例えば、 次のメソッドの場合、
void mymethod (int len, String str);
CallVoidMethod に対して以下のプロトタイプをコーディングすることができます。
図 1. CallVoidMethod を呼び出すサンプル RPG コーディング
D CallMyMethod    PR                  EXTPROC(*CWIDEN
D                                     : JNINativeInterface.
D                                       CallVoidMethod_P)
D env                                 LIKE(JNIEnv_P) VALUE
D obj                                 LIKE(jobject) VALUE
D methodID                            LIKE(jmethodID) VALUE
D len                                 LIKE(jint) VALUE
D str                                 LIKE(jstring) CONST
D dummy                          1a   OPTIONS (*NOPASS)

…

CallMyMethod (JNIEnv_P : objectId : methodId : 10 : string);       
CallVoidMethodA:
メソッドを呼び出す場合に別のプロトタイプを作成したくない場合には、この方法を選択します。 この方法では、配列の各要素が 1 つのパラメーターを保持する、jvalue 構造の配列を想定しています。前述の 図 1 はこの例です。
CallVoidMethodV:
これは RPG コードの中では使用してはなりません。これは C 構成を想定したもので、RPG でコーディングするのはきわめて不向きです。

実際にどの機能を呼び出すかは、戻り値のタイプによって決まります。例えば、メソッドが整数を戻す場合であれば、 CallIntMethodA を使用することになります。これらの機能のクラスおよび methodID パラメーターを入手するには、FindClass と GetMethodID または GetStaticMethodID を使用します。

注: JNI を直接に呼び出す場合、クラス名はピリオド (.) ではなくスラッシュ (/) を区切り文字として使用して指定する必要があります。例えば、「java/lang/String」であって、「java.lang.String」ではありません。