0

RPGLE から Java メソッドを呼び出す必要があります。次のエラーが発生します。メソッドのプロトタイプを作成した方法が間違っていると思います。

    Cause . . . . . :   RPG procedure TESTJ in program TESTLIB/TESTJ received 
  Java exception "java.lang.NoSuchMethodError:                             
  NumberToWord.strconvert([B)Ljava/lang/String;" when calling method       
  "strconvert" with signature "([B)Ljava.lang.String;" in class            
  "NumberToWord". 

私のJavaコードは正常に動作します。コードは以下のようなものです、

public class NumberToWord
{
 .....
  .
   .
   public static String strconvert(String nms) {
    .
    .
    .
    return nms;
   }

}

間違っているはずの私の RPGLE コードは次のとおりです。

  /free

   ctl-opt  dftactgrp(*no) actgrp(*caller);

   dcl-s String1 object(*java:'java.lang.String');
   dcl-s String2 object(*java:'java.lang.String');
   dcl-s str varchar(250);
   dcl-s JAVA_String object( *JAVA :'java.lang.String' );   


   dcl-pr JAVA_toString like( JAVA_String )
                        extproc( *JAVA :
                                 'java.lang.String' :
                                 *constructor );
   value varchar( 65535 ) const;
   end-pr;


   dcl-pr getNMTW static like( JAVA_String )
                        extproc( *JAVA :
                                 'NumberToWord' :
                                 'strconvert' );
   value varchar(65535) const;
   end-pr;


   dcl-pr getBytes char(250) extproc(*java:'java.lang.String':'getBytes');

   end-pr; 



   String1 = JAVA_toString('543');  //works fine

   str = getBytes(String1);         //works fine

   String2 = getNMTW('12345');      //exception occurs at this point

   str = getBytes(String2);

   *INLR = *ON;

 /END-FREE

JAVA_toString メソッドと getBytes メソッドは正常に動作しますが、デバッグ時に getNMTW 関数で例外が発生します。

CLASSPATH はすでに設定されています。NoClassFound エラーの代わりに NoSuchMethodError を取得しているので、問題ないと思います。

4

2 に答える 2

2

関数 getNMTW の宣言は、varchar を Java メソッドに渡すように設定されているようです。RPG が Java を呼び出すと、varchar フィールドは Java バイト配列に変換されます。したがって、最初に RPG フィールドを Java String に変換してから、その文字列を渡す必要があります。これを試して:

dcl-pr getNMTW static like( JAVA_String )
                     extproc( *JAVA :
                              'NumberToWord' :
                              'strconvert' );
   value object( *JAVA :'java.lang.String' ) ;
end-pr;

その後:

String2 = JAVA_toString('12345');
String2 = getNMTW('12345');

2 番目のオプションは、Java の getNMTW メソッドを変更してバイト配列を受け入れ、そのバイト配列を Java の String に変換することです。これは、RPG コードを整理するのに役立つため、私が好む方法です。しかし、どちらの方法でも機能します。

于 2016-10-31T12:56:53.253 に答える