• 0
Pavel M

JAVA и Delphi

Вопросы

Прошу помощи в определении моих ошибок при написании и использования обёртки (часть библиотеки)
Или ответа типа "используемый JAR непригоден для использования с DELPHI".

Подробности ниже:

Мне предоставили developer kit кассы (работает на андройде).
Приложение Delphi типа Hello world на кассу поставил легко, но пока не получается работать со встроенным функционалом (пользователи, товары, чеки и пр).

Библиотека кассы написана на Kotlin, я скомпилировал её целиком Android Studio в файл ".aar", затем распаковал как архив и вытащил ".jar", затем надеюсь создал корректную обёртку.
(JAR закидываю как библиотеку к проекту на Delphi 10.1 update 2, вызываю как статик так и просто - либо не видит метод, либо приложение вылетает)

Java2OP при создании обёртки вообще вылетает с ошибкой, буду признателен если подскажите как ему или чему то ещё правильно скормить эту библиотеку.

Пример обёртки которую я использую:

unit jdelphi;

interface

uses
  AndroidAPI.JNIBridge,
  Androidapi.JNI.JavaTypes;

type
  JUser = interface;

  JUserClass = interface(JObjectClass)
    ['{A4B29440-8C8B-4C1F-A8E7-B7612D4FEEB4}']
   
    function getUuid : JString; cdecl;                                         
    function hashCode : Integer; cdecl;                                        
    function init(uuid : JString; secondName : JString; firstName : JString; inn : JString; phone : JString; pin : JString; roleUuid : JString; roleTitle : JString) : JUser; cdecl; overload;
    function init(uuid : JString; secondName : JString; firstName : JString; phone : JString; pin : JString; roleUuid : JString; roleTitle : JString) : JUser; cdecl; overload;
    function toString : JString; cdecl;                                     
  end;

  [JavaSignature('ru/evotor/framework/users/User')]
  JUser = interface(JObject)
    ['{2558685B-2BDC-4FCE-901F-3B53604E37C6}']
    function equals(JObjectparam0 : JObject) : boolean; cdecl;                 
    function hashCode : Integer; cdecl;                                       
    function toString : JString; cdecl;                                       
  end;

  TJUser = class(TJavaGenericImport<JUserClass, JUser>)
  end;

implementation

procedure RegisterTypes;

begin
  TRegTypes.RegisterType('jdelphi.JUser', TypeInfo(jdelphi.JUser));
end;

initialization
  RegisterTypes;
end.

 

Программа Hello World!:

unit Unit1;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes,
  System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
  FMX.Controls.Presentation, FMX.StdCtrls, FMX.Objects,
  FMX.Platform.Android, Androidapi.JNI.JavaTypes, Androidapi.Helpers;

type
  TForm1 = class(TForm)
    btnExit: TButton;
    StyleBook1: TStyleBook;
    Text1: TText;
    btnGet: TButton;
    lbResult: TLabel;
    procedure btnExitClick(Sender: TObject);
    procedure btnGetClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.fmx}

uses jdelphi;

procedure TForm1.btnExitClick(Sender: TObject);
begin
  MainActivity.finish;
end;

procedure TForm1.btnGetClick(Sender: TObject);
// var
// TestClass: JUser;
begin
  // TestClass := TJUser.Create;
  // lbResult.Text:= JStringToString(TestClass.getUuid);

  lbResult.Text := JStringToString(TJUser.JavaClass.getUuid);

end;

end.

 

Спасибо, за любые комментарии, мысли или советы.

 

Изменено пользователем Pavel M

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 ответ на этот вопрос

  • 1

@Pavel M, Судя по вашей обертке класса и самой JAR:

  1.  Нужно удалить все не статические методы из описания интерфейса наследуемого от JObjectClass:
      JUserClass = interface(JObjectClass)
        ['{A4B29440-8C8B-4C1F-A8E7-B7612D4FEEB4}']
        function init(uuid : JString; secondName : JString; firstName : JString; inn : JString; phone : JString; pin : JString; roleUuid : JString; roleTitle : JString) : JUser; cdecl; overload;
        function init(uuid : JString; secondName : JString; firstName : JString; phone : JString; pin : JString; roleUuid : JString; roleTitle : JString) : JUser; cdecl; overload;
      end;
  2. У класса User нету конструктора по умолчанию, поэтому вызов такого кода вызовет ошибку:
    //неправильный вариант с ошибкой
    TestClass := TJUser.Create;
    
    //правильный вариант
    TestClass := TJUser.JavaClass.init(
        StringToJString('uuid'),
        StringToJString('secondName'),
        StringToJString('firstName'),
        StringToJString('phone'),
        StringToJString('pin'),
        StringToJString('roleUuid'),
        StringToJString('roleTitle')
       );

     

  3. Если к проекту подключаете любые JAR файлы, то следите, чтобы вместе с ними были подключены и все остальные .jar библиотеки с классами, на которые ссылаются исходники. Например, в Вашем примере при вызове вышеприведенного конструктора первым делом выскочит ошибка:

image.png.b99efc947b37811334b140361f0d7bc7.png

Вам нужно найти все такие подключения и найти сборки, в которых они валяются:

image.png.5ad2aaec7da206c4ddcdb50273f732b2.png

Если в проекте в Android Studio включено копирование всех сторонних библиотек в папку libs, то после компиляции всего преокта практически все либы можно найти:

  • папка libs;
  • output папке проекта;
  • папка Android SDK.

п.с. Тему лучше перенести в раздел Android, так больше шансов получить помощь.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу