从 RPGLE (as400) 调用 java 方法
Call java method from RPGLE (as400)
我需要从 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 错误。
您的函数 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 代码不那么混乱。但无论哪种方式都行得通。
我发现了错误。
当 JVM 已经启动时,Java 无法识别该作业中的更改
我必须注销并重新登录才能看到我对 java 函数所做的更改。
我需要从 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 错误。
您的函数 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 代码不那么混乱。但无论哪种方式都行得通。
我发现了错误。
当 JVM 已经启动时,Java 无法识别该作业中的更改 我必须注销并重新登录才能看到我对 java 函数所做的更改。