Перейти к содержанию
Fire Monkey от А до Я
  • 0

JAVA и Delphi


Pavel M

Вопрос

Прошу помощи в определении моих ошибок при написании и использования обёртки (часть библиотеки)
Или ответа типа "используемый 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

@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, так больше шансов получить помощь.

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

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

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