Jump to content

Утилита генерации заголовочных файлов для Java (Java2Delphi)


Yaroslav Brovin

161 views

В ближайшие дни выйдет новый релиз библиотеки FGX Native 1.9.3.0, главной новинкой которой будет утилита командной строки для генерации заголовочных файлов Delphi для использования Java API /Android API

Утилита располагается в каталоге "$(FGX)\Tools\Java2Delphi" и в ее состав входят:

  1. Java2Delphi.exe - утилита.
  2. config.template.json - Шаблон конфигурационного файла, в котором указаны правила формирования итоговых Delphi-модулей.
  3. api-versions.android-28.xml - Файл с информацией об Android API 28 версии.
  4. UsedGUID.txt - набор использованных GUID значений для Delphi интерфейсов.
  5. run.bat - пакетный файл для запуска утилиты в любом месте.

Перед первым применением необходимо выполнить настройку утилиты.

Настройка

Управление утилитой идет при помощи конфигурационного json-файла, передаваемого через аргументы командной строки. Перед первым применением, необходимо:

1. Создать каталог в любом месте, где будут размещены все результаты генерации.

2. Скопировать файл "run.bat" в каталог (1).

3. Скопировать конфигурационный шаблон "config.template.json" в каталог (1) и назвать его "config.json" (название может быть любым).

4. Отредактировать базовые настройки Java окружения:

    "javap": "$(JAVA_HOME)\\bin\\javap.exe",
    "jar": "$(JAVA_HOME)\\bin\\jar.exe",

Java2Delphi использует две утилиты командной строки из Java SDK: "javap.exe" и "jar.exe". По умолчанию она использует переменную окружения $(JAVA_HOME). Если она у вас указана в Windows, то этот шаг можно пропустить. Если нет, то либо необходимо добавить ее с указанием местоположения Java JDK:

image.png

или напрямую указать пути к требуемым утилитам.

5. Указываем пути, куда будут помещены результаты генерации (опционально).

    "outputDir": ".\\Headers",
    "signatureOutputDir": ".\\Signatures",
  • outputDir - каталог, куда будут помещены pas файлы с необходимыми обертками Java/Android Api.
  • signatureOutputDir - вспомогательный каталог, куда будут помещены вспомогательные файлы с сигнатурами Java классов.

После выполнения первичной настройки файла конфигурации, приступим теперь к указанию, какие Java классы надо транслировать.

Правила генерации файлов

Для того, чтобы сгенерировать заголовочные файлы необходимо указать:

  1. Jar-библиотеки, которые содержат необходимые Java классы.
  2. Указать требуемые для перевода Java классы.
  3. Указать, в какие Delphi модули разместить результирующие обертки.

1. Указываем нужные jar библиотеки.

Библиотеки указываются в секции jars:

"jars": [
        "E:\\Development\\Android\\platforms\\android-28\\android.jar"
    ],

По умолчанию, мы всегда подключаем jar библиотеку Android (по-этому не удаляйте ее, если хотите совместимости с Android API).
Вам необходимо откорректировать расположение данного файла с учетом вашей системы. 

2. Указываем требуемые для перевода Java классы.

Теперь мы должны сказать утилите в секции "classes", какие классы нас интересуют в этих библиотеках. Здесь необходимо использовать полное название Java типов с учетом названия пакета:

    "classes": [
        "java.lang.Object",
        "java.lang.CharSequence",
        "java.lang.String",
        "java.lang.Class",
        "java.lang.Boolean",
        "java.lang.Number",

        // Можно использовать * на конце пакета, чтобы выбрать все классы в данном пакете
        "android.provider.*",

        "android.view.animation.Animation",
        "android.view.animation.Animation.AnimationListener",
        "android.view.animation.Animation.Description",

        // и тд

По умолчанию шаблон включает в себя все классы из Android API, которые используются в FGX Native. Поэтому не удаляйте эти классы, если вы хотите получить заголовочные файлы, совместимые с уже существующими хедерами в FGX Native.

Добавьте сюда те, которые вас интересуют.

Поскольку в некоторых библиотеках могут быть 1000 классов. То обработка такого количества классов займет много времени. Помимо этого, вы получите гигантских размеров заголовочные файлы. Поэтому лучше добавлять только те классы, которые вам реально нужны для вызовов, а не все.

3. Указываем правила генерации Delphi модулей.

После того, как мы перечислили интересуемые нас Java классы, нам остается только указать, в какие Delphi модули их следует поместить. Это делается через "output":

"output": [
        {
            "name": "Android.Api.Text", // Название Делфи модуля Android.Api.Text.pas
            "uses": [ // Подключаемые Делфи модули в Android.Api.Text.pas
                "Android.Api.JavaTypes",
                "Android.Api.ActivityAndView"
            ],
            "classes": [ // Java классы, обертки над которыми будут добавлены в Android.Api.Text.pas
                "android.text.*"
            ],
            "exclude": [ // Опционально, можно исключить некоторые классы
                "android.text.method.*",
                "android.text.util.*",
                "android.text.ClipboardManager*"
            ]
        }
    ]

Генерация

Поздравляю, теперь вы можете запустить утилиту и наблюдать, как она трудится формируя заголовочные файлы по вашим правилам.

2021-03-13_21-51-47.png

Обратите внимание, что первый запуск занимает много времени, так как утилита генерирует сигнатуры Java классов (именно они используются для анализа структуры Java классов) и помещает их в каталог "signatureOutputDir". Однако, последующие запуски будут выполняться моментально, за счет того, что утилита не выполняет повторную генерацию сигнатур, если она уже есть. 

Не удаляйте файлы сигнатур, они помогут ускорить повторную генерацию заголовочных файлов.

Разбор пропущенных классы/методов/полей

В процессе генерации утилита выполняет много сложной работы с анализом зависимостей, доступных типов и тд. Если какой-то из Java типов не указан в секции "classes", то утилита пропустит все его использования. При этом она сообщит об этом через лог.

Например: При генерации класса android.text.HTML были пропущены два метода fromHTML (они не попали в pas файлы), потому что не был указан тип android.text.Html$ImageGetter.

Skipped members of the Java type: android.text.Html
  Methods:
    - fromHtml(const AArg0: JString; const AArg1: Integer; const AArg2: JHtml_ImageGetter; const AArg3: JHtml_TagHandler): JSpanned; [android.text.Html$ImageGetter]
    - fromHtml(const AArg0: JString; const AArg1: JHtml_ImageGetter; const AArg2: JHtml_TagHandler): JSpanned; [android.text.Html$ImageGetter]

Если вам нужны эти методы, то необходимо в секцию classes добавить этот тип:

    "classes": [
        "android.text.Html.ImageGetter",

Обратите внимание, что в Java "$" - это разделитель для вложенных классов. Однако в конфигурационном файле вместо него надо использовать ".".

  • Like 8

0 Comments


Recommended Comments

There are no comments to display.

Guest
Add a comment...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...