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 已设置。我认为这很好,因为我得到的是 NoSuchMethodError 而不是 NoClassFound 错误。

4

2 回答 2

2

看起来您对函数 getNMTW 的声明设置为将 varchar 传递给 Java 方法。当 RPG 调用 Java 时,varchar 字段转换为 Java 字节数组。因此,您首先需要将 RPG 字段转换为 Java 字符串,然后传递该字符串。尝试这个:

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');

第二种选择是更改 Java getNMTW 方法以接受字节数组,然后将字节数组转换为 Java 中的字符串。这是我的首选方法,因为它有助于保持 RPG 代码不那么混乱。但无论哪种方式都会奏效。

于 2016-10-31T12:56:53.253 回答
1

我发现了错误。

当 JVM 已经启动时,Java 在该作业中无法识别更改,我必须注销并重新登录才能查看我对 java 函数所做的更改。

http://www.ibm.com/developerworks/rational/cafe/docBodyAttachments/2681-102-2-7220/Troubleshooting_RPG_Calls_To_Java_v2.html#changeclasses

于 2016-10-31T15:16:52.257 回答