簡體   English   中英

從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中將字節數組轉換為String。 這是我的首選方法,因為它有助於使RPG代碼保持混亂。 但是任何一種方法都行得通。

我發現了錯誤。

當JVM已經啟動時,在該作業中Java無法識別所做的更改,因此我必須先注銷然后再次登錄以查看對Java函數所做的更改。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM