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

Как осуществить связь между Delphi интерфейсом и Java классом?


antarey

Вопрос

При написании обертки для ява кода необходимо связать делфи интерфейс и ява класс

  JAntareyAnimationClass = interface(JFMXNativeActivityClass)
    ['{3FC48462-87FD-4F6C-9B15-02BC09D67168}']
    function init(context: JContext): JAntareyAnimation; cdecl;
//    function init: JAntareyAnimation; cdecl;
  end;


  [JavaSignature('com/antarey/AntareyAnimation')]
  JAntareyAnimation = interface(JFMXNativeActivity)
    ['{38A1F738-CDE7-46F6-AA07-5A453A3AC0B2}']
    procedure Rotate3D(); cdecl;
  end;
или
  JToastClass = interface(JObjectClass)
  ['{69E2D233-B9D3-4F3E-B882-474C8E1D50E9}']
    {Property methods}
    function _GetLENGTH_LONG: Integer; cdecl;
    function _GetLENGTH_SHORT: Integer; cdecl;
    {Methods}
    function init(context: JContext): JToast; cdecl; overload;
    function makeText(context: JContext; text: JCharSequence; duration: Integer): JToast; cdecl;
    {Properties}
    property LENGTH_LONG: Integer read _GetLENGTH_LONG;
    property LENGTH_SHORT: Integer read _GetLENGTH_SHORT;
  end;


  [JavaSignature('android/widget/Toast')]
  JToast = interface(JObject)
  ['{FD81CC32-BFBC-4838-8893-9DD01DE47B00}']
    {Methods}
    procedure cancel; cdecl;
    function getDuration: Integer; cdecl;
    function getGravity: Integer; cdecl;
    function getHorizontalMargin: Single; cdecl;
    function getVerticalMargin: Single; cdecl;
    function getView: JView; cdecl;
    function getXOffset: Integer; cdecl;
    function getYOffset: Integer; cdecl;
    procedure setDuration(value: Integer); cdecl;
    procedure setGravity(gravity, xOffset, yOffset: Integer); cdecl;
    procedure setMargin(horizontalMargin, verticalMargin: Single); cdecl;
    procedure setText(s: JCharSequence); cdecl;
    procedure setView(view: JView); cdecl;
    procedure show; cdecl;
  end;

как определить ету связь - исходя из чего

Спасибо

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

Рекомендуемые сообщения

  • 0
  • Администраторы

Для версий выше, включая XE7

Используйте специальную утилиту для автоматического получения pas файлов: "Утилита генерации pas файлов для AndroidAPI из jar файлов"

 

Актуально для XE6 и ниже

Связь происходит автоматически по атрибуту:

 [JavaSignature('android/widget/Toast')]

Дополнительно советую зарегистрировать типы таким образом:

procedure RegisterTypes;
begin
  TRegTypes.RegisterType('com.antarey.AntareyAnimation', TypeInfo(<Название вашего юнита>.JAntareyAnimation)); 
end;

initialization
  RegisterTypes;
end.

Базовый интефейс для вашего класса, например для Toast должен соответствовать базовому классу Toast в Android Api.
 
Например, если Toast в Android API наследуется от java.lang.Object, то на стороне делфи обертка JToast должна расширять интерфейс JavaObject

JToastClass = interface(JObjectClass)
....

JToast = interface(JObject)

Как у вас и написано в вопросе. Мост программно проверит классы помеченные атрибутом JavaSignature (JavaSignatureAttribute - классовая реализация атрибута). И для них сделает связь с нативным классом.
 
Если вы неправильно укажите сигнатуру методов в интерфейсе JToast или неправильно определите базовый интерфейс, то будет ошибка при попытке вызова неправильного метода, а не на этапе компиляции, так как мост программный. При этом нужно знать:

  • Что не обязательно транслировать в JToast все методы из Android Api, достаточно объявить только нужные вам.
Изменено пользователем Brovin Yaroslav
Объединен с моим ответом позже
Ссылка на комментарий
  • 0
  • Модераторы
20 часов назад, x11 сказал:

что такое JView  и как с этим работать?

View в андроиде это аналог TComponent/TControl в делфи

от него наследуются остальные View -> Button/TextView/ListView/GridView/.........

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

Тут вопрос в другом. Можно создать свой кастомный Toast. И для этого нужно что-то делать с JView: http://fire-monkey.ru/topic/4827-окно-на-переднем-плане-во-время-звонка/?do=findComment&comment=30431Примеров и описания я в сети не нашёл.

 

Изменено пользователем x11
Ссылка на комментарий

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

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

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

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

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

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

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

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

×
×
  • Создать...