Ошибка Callback JNA

Рейтинг: 0Ответов: 1Опубликовано: 05.07.2023

Столкнулся с ошибкой вывода в Java. При вызове callback'a выплёвывает следующее сообщение

Exception in thread "main" java.lang.StackOverflowError
JNA: error while handling callback exception, continuing    
Exception in thread "main" JNA: error while handling callback exception, continuing

При вызове процедуры происходит передача не маленького объема данных (около 20к. строк), после определенной строки начинает сыпать вышеуказанными предупреждениями. Пытался очищать память после вызова, вызывать отдельно и т.д.
Ниже приведён код структуры, callback'a и вызова самой функции.

public static class TTransactionInfo extends Structure implements Structure.ByReference{
            public short Size = 279;
            public short Kind;
            public long Summa;
            public short RestCode;
            public double LogDate;
            public byte UnitNum;
            public int CheckNo;
            public byte[] Comment = new byte[254];

            @Override
            protected List<String> getFieldOrder() {
                return Arrays.asList("Size", "Kind", "Summa", "RestCode", "LogDate", "UnitNum", "CheckNo", "Comment");}


            public TTransactionInfo(){}

            public TTransactionInfo(short Size){
                this.Size = Size;
                new Memory(Size);
            }
        }

public interface GetTransactions extends Callback {
       default void callback(int account, double datetime, TTransactionInfo transact) {
          //здесь выполняется заполнение списков, ошибка появляется даже при отсутствии действий в этом блоке.
       }
}

boolean GetAllTransactions(double dateFirst, double dateLast, GetTransactions transaction);

Далее вызываю в методе main следующим образом

final static CscLink myLib = (CscLink) CscLink.INSTANCE;
myLib.GetAllTransactions(dates, dates, transact);

Ниже приведу фрагменты кода из delphi

type
  TTransactionInfo = packed record
    Size      : Word;    // Size of TTransactionInfo - заполнить перед вызовом
    Kind      : Word;    // 0-оплата 1-скидка 2-бонус 3-потраты гостя
    Summa     : Comp;    // сумма в копейках
    RestCode  : Word;    // код ресторана
    LogDate   : Integer; // дата чека (0 -> 30/12/1899)
    UnitNum   : Byte;    // номер кассы
    CheckNo   : Integer; // номер чека
    Comment   : Array[0..255] of Char; //комментарий - для ручных транзакций
  end;

type
  {процедура обратного вызова для перечисления транзакций}
  TEnumTransactions = Procedure( Account: Integer; When: TDateTime; const Info: TTransactionInfo ); stdcall;

{перечисление всех транзакций, результаты возвращаются через процедуру Proc}
Function GetAllTransactions( DateFirst, DateLast: TDateTime; Proc: TEnumTransactions ): BOOL; stdcall;

Ответы

▲ 0Принят

В общем всё было довольно просто в решении, но надо было прошерстить очень много документации и вариаций решения всего действия. Так как моя библиотека закрытая и довольно старая Callback нужно объявить как:

public static class TEnumTransactions implements StdCallCallback{
     public void callback (int account, double datetime, TTransactionInfo transact) {
         //код исполнения
     }
}

В общем то и вся суть. После имплементации StdCallCallback все ошибки ушли в небытие.