Вызов метода Java из RPGLE (as400)

Мне нужно вызвать метод Java из RPGLE, я получаю следующую ошибку. Я думаю, что способ, которым я сделал прототип метода, неправильный.

    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 ответа

Решение

Я нашел ошибку.

когда JVM уже запущена, изменения не распознаются Java в этой работе, я должен выйти из системы и войти снова, чтобы увидеть изменения, которые я внес в функцию java.

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

Похоже, ваше объявление для функции 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 менее загроможденным. Но в любом случае будет работать.

Другие вопросы по тегам