Jump to content

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


Yaroslav Brovin

2,062 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

5 Comments


Recommended Comments

Добрый день, Ярослав!

Большое спасибо за подробное описание утилиту Java2Delphi, но с пол пинка оно не работает 😪

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

Цитата

FGX Native Java to Delphi generator, version 2.2
Copyright c 2021, Brovin Yaroslav
All rights reserved

Value 'outputDir' not found
Generation of java wrappers is completed.

{
    "javap": "C:\\Program Files\\AdoptOpenJDK\\jdk-8.0.242.08-hotspot\\bin\\javap.exe",
    "jar": "C:\\Program Files\\AdoptOpenJDK\\jdk-8.0.242.08-hotspot\\bin\\jar.exe",
    "outputDir": ".\\Headers",
    "signatureOutputDir": ".\\Signatures",
    "xmls": [
        "$(FGX)\\Tools\\JavaToDelphi\\api-versions.android-28.xml"
    ],
    "jars": [
        "C:\\Android\\SDK\\platforms\\android-30\\android.jar",
        "C:\\Android\\AIDL\\output\\jar\\IFiscalCore.jar"
    ],
    "classes": [
        "java.lang.Object",
        "java.lang.CharSequence",
        "java.lang.String",
        "java.lang.Class",
.....

И еще. Я так и не понял, если я хочу создать заголовочник только для классов из jar-библиотеки C:\Android\AIDL\output\jar\IFiscalCore.jar,  мне обязательно добавлять  всю андроид библиотеку C:\Android\SDK\platforms\android-30\android.jar и все классы из этой библиотеки в мой заголовочник?

 

config.json.txt

Edited by Benten
Link to comment
  • Administrators

Здравствуйте.

2 часа назад, Benten сказал:

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

У вас невалидный конфиг с точки зрения json.

Уберите запятую в у последнего элемента массива

"com.multisoft.drivers.fiscalcore.*"

image.png

  • Like 2
Link to comment
4 часа назад, Viktor Akselrod сказал:

Уберите запятую в у последнего элемента массива

"com.multisoft.drivers.fiscalcore.*"

Спасибо, мне очень стыдно  🙃

7 часов назад, Benten сказал:

И еще. Я так и не понял, если я хочу создать заголовочник только для классов из jar-библиотеки C:\Android\AIDL\output\jar\IFiscalCore.jar,  мне обязательно добавлять  всю андроид библиотеку C:\Android\SDK\platforms\android-30\android.jar и все классы из этой библиотеки в мой заголовочник?

А как быть со второй частью вопроса?  Можно не добавлять всю библиотеку android.jar в свой зоголовочник, или это обязательное условие?

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

P.S. Очень надеюсь, что так и не придется глубже вникать в язык Java, хватит только знаний Delphi и отличной FGX-Native

Link to comment
  • Administrators
2 минуты назад, Benten сказал:

А как быть со второй частью вопроса?  Можно не добавлять всю библиотеку android.jar в свой зоголовочник, или это обязательное условие?

Обязательно нужно добавлять. Android.jar - это по сути Java часть реализации Андроида. В нее входит в том числе Java SDK, это базовые типы (как в делфи RTL). Любая Андроид библиотека использует как минимум классы из Java SDK, поэтому необходимо для генератора добавить android.jar. В противном случае, если генератор не найдет нужные классы, которые использует ваша библиотека, она просто не будет включать их обертку в делфи хедер.

  • Like 1
Link to comment

Спасибо, ребята, все получилось.

Осталось разобраться, как со всем этим хозяйством заголовочника работать в Delphi.  Буду изучать матчасть.

Полученный заголовочник прикладываю, вдруг кому пригодится, все-таки проделана немалая работа по переводу из файлов описания интерфейсов *.aidl   в  pascal header

 

com.multisoft.drivers.fiscalcore.api.pas

  • Like 1
  • Thanks 1
Link to comment
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.

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...