从RPGLE(as400)调用java方法

问题描述 投票:0回答:3

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

java ibm-midrange rpgle rpg freeform
3个回答
3
投票

看起来函数 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 代码不那么混乱。但无论哪种方式都会起作用。


2
投票

我发现了错误。

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

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


0
投票

传递一个数组而不是一个简单的字符怎么样?

© www.soinside.com 2019 - 2024. All rights reserved.