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

Линковка Kotlin (Котлин) библиотек в Delphi


Slym

Вопрос

Линковка Kotlin (Котлин) библиотек в Delphi, как делаю:
Хедеры линкуемых библиотек обычно громадны описанием всех типов...
Я обычно делаю свой jar на java в нем линкую зависимости и наружу для дельфи оставляю один объект с простыми функциями.
Хедер дельфи получается компактным и понятным:

package com.MyCompany.evotor;

public interface J2DCallback {
    void Log(String str);
    String Trans(String str);
    String GetValue(String name);
    void SetValue(String name, String value);
    Activity GetActivity();
    Context GetContext();
}

public class FiscalCoreConnection {
    final private Global Instance;

    public FiscalCoreConnection(J2DCallback aj2d) throws NullPointerException {
        Instance = new Global(aj2d);
    }

    public String SendJSON(String JSON){
        try{
            return Instance.SendJson(JSON);
        }
        catch (Exception e) {
            return FiscalCoreException.MakeJson(e);
        }
    }
}

type
  J2DCallbackClass = interface(IJavaClass)
    ['{856654D5-7939-44DF-ACD5-E2EF8C6D3AA4}']
  end;

  [JavaSignature('com/MyCompany/evotor/J2DCallback')]
  J2DCallbackIntf = interface(IJavaInstance)
    ['{025B14E9-C041-4105-9E85-83CC127CC340}']
    procedure Log(str:JString); cdecl;
    function Trans(str:JString):JString; cdecl;
    function GetValue(name:JString):JString; cdecl;
    procedure SetValue(name:JString; value:JString); cdecl;
    function GetActivity():JActivity; cdecl;
    function GetContext():JContext; cdecl;
  end;
  TJ2DCallbackImp = class(TJavaGenericImport<J2DCallbackClass, J2DCallbackIntf>) end;

  [JavaSignature('com/MyCompany/evotor/FiscalCoreConnection')]
  JFiscalCoreConnection = interface(JObject)
    ['{5797747D-D61D-4EF6-94F7-5E8994545CC2}']
    function SendJSON(JSON:JString):JString; cdecl;
  end;
  JFiscalCoreConnectionClass = interface(JObjectClass)
    ['{81782882-DFCF-4FA9-BD37-02CCCF2409EA}']
    function init(j2d : J2DCallbackIntf) : JFiscalCoreConnection; cdecl;
  end;
  TJFiscalCoreConnection = class(TJavaGenericImport<JFiscalCoreConnectionClass, JFiscalCoreConnection>)
  end;
    
  TJ2DCallback = class(TJavaLocal, J2DCallbackIntf)
  public
    procedure Log(str:JString); cdecl;
    function Trans(str:JString):JString; cdecl;
    function GetValue(name:JString):JString; cdecl;
    procedure SetValue(name:JString; value:JString); cdecl;
    function GetActivity():JActivity; cdecl;
    function GetContext():JContext; cdecl;
  end;

Все зависимости в build.gradle:

dependencies {
    implementation 'com.github.evotor:integration-library:v0.4.50'
    implementation 'com.google.zxing:core:3.4.0'
}

В Дереве External Libraries забираем jarы зависимостей
image.png.9c3106188a085711122eef42b2745c28.png

ПКМ Show in Explorer. Копируем в папку своего проекта и даем осознанное имя.

Там же забираем kotlin-stdlib
image.png.1f607451ff9bfcf896d7611fde8a3600.png

ПКМ Show in Explorer. Копируем в папку своего проекта и даем осознанное имя.
Но в kotlin-stdlib.jar есть "лишний" файл kotlin-stdlib-1.5.10.jar\META-INF\versions\9\module-info.class
Открываем архиватором и удаляем файл или всю папку versions
image.png.cff0e34871eb69a6b32d0a12a24a5550.png

Почти все готово... Но котлин еще и посыпан сахаром и не хочет Дельфей dexится, хочет -min-sdk-version=26
Поможем Delphi:
Ищем CodeGear.Common.Targets, у меня он в "C:\Program Files (x86)\Embarcadero\Studio\21.0\bin"\
Ищем в нем --output, и перед ним вставим все про sdk. У меня получилось так:
    <DxCmd>PATH $(JDKPath)\bin;$(PATH); %26 set JAVA_HOME=$(JDKPath)%26 "$(JavaDxPath)" --dex --min-sdk-version=26 --output=</DxCmd>

Далее цепляем все jar в проект
image.png.a633a73ee82fa2ad627b2ca5a85c510d.png
Либа производителя, Либа своя обертка, и котлин
Иии собираем!

Если есть еще зависимости делаем аналогично:
находим jar, выпиливаем META-INF\versions\9\module-info.class, линкуем в проект и собираем...
Не все зависимости используются и нужны, поэтому добавляем поштучно до тех пор пока не заведется.

Изменено пользователем Slym
добавил интерфейс
Ссылка на комментарий

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

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

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

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

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

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

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

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

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

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