从RPGLE调用java方法(as400)

时间:2016-10-31 04:24:42

标签: java ibm-midrange rpgle rpg freeform

我需要从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错误。

2 个答案:

答案 0 :(得分: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');

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

答案 1 :(得分:1)

我发现了错误。

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

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