我需要从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错误。
答案 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函数所做的更改。