Ошибка Callback JNA
Столкнулся с ошибкой вывода в 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;