JVM Native API плагин — для запуска в 1С плагинов написанных на Java



Запускаем виртуальную машину Java в 1С.
Собрана внешняя компонента которая позволяет запускать виртуальную машину java в среде 1С. Позволяет как передавать параметры в java — так и получать уведомление через externalevent.
Предпосылкой создания являлся тот факт, что есть много готового функционала которого не хватает в 1С. Язык сpp — довольно сложен для быстрой разработки, и теперь возможно использовать готовые сборки java классов (так называемые jar-файлы) для использования в 1С.

Собрана только под Windows 32-bit и 64-bit!

Компонента позволяет запускать виртуальную машину Java в 1С, загружать необходимые jar – библиотеки, а так же выполнять методы.

GITHUB репозиторий: JVM-plugin

В примере собранный jar-файл с двумя классами:

  1. первый пример вычисляет факториал и выводит в лог строку;
  2. второй пример вычисляет расстояние Левенштейна для двух строк;
  3. загрузка файла — по имени файла возвращает двоичные данные;
  4. "скриншот" — возвращает скриншот экрана в виде двоичных данных.

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

Ограничения:

  •  Виртуальная машина запускается один раз и может быть запущена только в одном экземпляре;

  • После завершения работы виртуальная машина не может быть повторно запущенна;

  •  Разрядность виртуальной машины должна соответствовать разрядности 1С;

  •  Добавлять jar-файлы после запуска JVM нельзя;

  •  Обновить java классы после запуска JVM нельзя;

  • Возможны проблемы с повторным запуском javafx — приложений.

Для работы необходима установленная JDK 8

  1. Первый параметр JAVA_HOME путь к JDK (32-bit или 64-bit в зависимости от клиента 1С);
  2. Второй так называемый CLASSPATH — путь к jar библиотекам.
  3. Для корректной работы необходимо установить переменную среды: JAVA_HOME

В архиве приложена конфигурация и собранный(подписанный) jar-файл.

Пример работы с компонентой:

Работа в клиент-серверном варианте в СКД:

Написание плагина для Kafka (Simple Consumer)

 

Kafka producer + consumer — параллельно.

 

62 Comments

  1. blackhole321

    А пример кода 1С:Предприятие (типа пример использования) можно добавить в публикацию?

    Reply
  2. minimajack

    (1) Компонента находится в стадии разработки

    Если ПодключитьВнешнююКомпоненту(имядлл, «AddInNative»,ТипВнешнейКомпоненты.Native ) Тогда
    Сообщить(«Подключилась!»);
    ОбъектJvm = Новый(«AddIn.AddInNative.JVMLauncher»);
    ОбъектJvm.javaHome = «d:/Program Files (x86)/Java/jdk1.8.0_172/»;
    ОбъектJvm.libraryDir = «d:/»;
    ОбъектJvm.AddJar(«Runner-0.0.1-SNAPSHOT.jar»);
    КонецЕсли;
    

    Показать

    Далее вызываем метод и передаем имя java-класса который будет исполнять работу.

    ОбъектJvm.LaunchInJVM(«Compare»);
    ОбъектJvm.LaunchInJVM(«Runner»);
    Reply
  3. blackhole321

    (2)Спасибо! А параметры?

    Reply
  4. minimajack

    (3) Само апи пока не закончено. То есть передавать параметры можно — но в демо примере такого нет.

    Разница между 1С и java слишком большая и скорее всего придется подготовить некоторый набор вариантов вызова:

    LaunchInJVM — без параметра

    LaunchInJVM_S с одним параметром типа строка

    LaunchInJVM_SS с двумя параметрами типа строка

    Reply
  5. OLEG4120

    Какой кейс у этого?

    Reply
  6. fishca

    Под линухами взлетает?

    Reply
  7. minimajack

    (5) возможность использования многочисленных java библиотек

    Reply
  8. minimajack

    (6) пока должным образом не проверял — сейчас апи наладить бы

    Reply
  9. minimajack

    Обновил пример.

    Поправил api — на текущий момент возможно вызывать передавая до 2-х параметров. Эти функции синхронные — то есть 1С ожидает завершения выполнения методов.

    ОбъектВК.LaunchInJVM(<ИмяКласса>); — без параметров

    ОбъектВК.LaunchInJVMP(<ИмяКласса>,<Параметр>); — с 1-м

    ОбъектВК.LaunchInJVMPP(<ИмяКласса>,<Параметр1>,<Параметр2>); — с 2-мя

    Типы параметров: строки, числа, булево. На основании типов параметров ищется метод в java ну и вызывается собственно.

    Кейсы самые разные: что то вычислять (работает JIT-компилятор, поэтому шустро), создавать дополнительные окна (работает swing, awt) с информацией, чаты, да что угодно в общем то.

    Reply
  10. Infactum

    (9) Можно просто XML с параметрами передать. Будет один метод.

    Reply
  11. minimajack

    (10) иногда все же удобней хотя бы 2…например передать бинарные данные и строку, все же лучше чем конвертировать в xml, а потом распаковывать в java

    Reply
  12. minimajack

    (6) Потестил чуть больше — взлетает, по крайней мере виртуальную машину удалось завести (на 32-битах). Думаю проблем особых не будет.

    Остальной код надо портировать и проверять

    Reply
  13. minimajack

    Добавлены функции возвращающие байтики:

    CallFInJVMB — без параметров

    CallFInJVMBP — с одним параметром

    CallFInJVMBPP — с двумя параметрами

    Для примера:

    CallFInJVMB — ОбъектВК.CallFInJVMB(«ScreenShot»); получение скриншота экрана

    CallFInJVMBP — ОбъектВК.CallFInJVMBP(«GetFile», ПутьКФайлу); чтение файла

    Вот такое в java — 2 строки и никакой возни с cpp

    Path path = Paths.get( file );
    return Files.readAllBytes( path );
    

    Скриншот уложился в 5 строк

            Robot robot = new Robot();
    BufferedImage screenShot = robot.createScreenCapture( new Rectangle( Toolkit.getDefaultToolkit().getScreenSize() ) );
    ByteArrayOutputStream buffer = new ByteArrayOutputStream();
    ImageIO.write( screenShot, «JPG», buffer );
    return buffer.toByteArray();
    

    p.s. Вот и преимущества java — работает из коробки, никаких плюсов (которые с++) и кроссплатформенно

    p.s.s. Архив обновлен

    Reply
  14. minimajack

    Как повернуть PDF на 90 градусов

    tPdf = ПолучитьИмяВременногоФайла(«pdf»);
    byteData = ОбъектВК.CallFInJVMBP(«PDFRotator», ПутьКПДФ);
    byteData.Записать(tPdf);
    ЗапуститьПриложение(tPdf);

    В файлы добавлен bouncy castle provider — который надо распаковать в JAVA_HOMEjrelibext\r

    Можно скачать самостоятельно

     bcmail-jdk15on-1.47.jar
    bcpkix-jdk15on-1.47.jar
    bcprov-jdk15on-1.47.jar

    Java код

        PdfReader reader = new PdfReader( fileName );
    int n = reader.getNumberOfPages();
    int rot;
    PdfDictionary pageDict;
    for ( int i = 1; i <= n; i++ )
    {
    rot = reader.getPageRotation( i );
    pageDict = reader.getPageN( i );
    pageDict.put( PdfName.ROTATE, new PdfNumber( rot + 90 ) );
    }
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    PdfStamper stamper = new PdfStamper( reader, baos );
    stamper.close();
    reader.close();
    return baos.toByteArray();

    Показать

    Reply
  15. virtex3

    а как на счет варианта, чтобы компонента работала на linux сервере где и запущен сервер 1С, чтобы пользователи не заморачивались с жавой?

    Reply
  16. minimajack

    (15) Под линукс ещё не портировал — да и на сервере не тестил.

    Java это не только утилити возможности…

    Визуализация полезна: для производства или склада можно отображать 3d модель по нажатию кнопки, отображать графики показателей(оборудования или ещё чего)…

    Тот же пдф-повернуть? Зачем кидать на сервер(с сервера) сотни мегабайт, если локально за секунды получим результат?

    В общем случае — не важно…есть инструмент, а как им работать каждый решает сам для себя

    Reply
  17. so-quest

    Наглый вопрос — Открытый репозиторий у компоненты есть?

    Reply
  18. Voffka

    Хм, интересьненько. 🙂

    Reply
  19. minimajack

    (17) нет

    Reply
  20. minimajack

    Обновил примеры:

    Можно открывать 3d модели(формат obj), вращать, приближать-удалять

    Reply
  21. minimajack

    Для всех стесняющихся — добавлено видео

    Reply
  22. minimajack

    Добавлен возврат строк из вызовов, архив обновлен.

    Для примера используется распознавание ШК из картинки и возврат ШК в виде строки.

    Строка64 = Base64Строка(Новый ДвоичныеДанные(ПутьКИзображениюШК));
    Сообщить(ОбъектВК.CallFInJVMP(«CodeScanner», Строка64, «»));

    в java

       public static String mainInt(String param) throws IOException, NotFoundException
    {
    ByteBufferInputStream is = new ByteBufferInputStream( ByteBuffer.wrap( Base64.decode( param ) ) );
    BufferedImage bufferedImage = ImageIO.read(is);
    LuminanceSource source = new BufferedImageLuminanceSource(bufferedImage);
    BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
    
    Result result = new MultiFormatReader().decode(bitmap);
    return result.getText();
    
    }

    Показать

    Reply
  23. haverlon

    Вещь интересная, под Linux бы пользовалась спросом)))

    Reply
  24. minimajack

    (23) сомневаюсь…доля windows юзеров значительно больше — а спроса нет

    Reply
  25. Evil Beaver

    Правильно ли я понял, что это аналог .NET Bridge для 1С от Elisy, только под Яву?

    Reply
  26. minimajack

    Это не полноценный мост…

    Изначально позиционируется как замена внешних компонент на c++.

    Концепция с созданием классов как в .NET bridge — но в 1с — мне не нравится.

    А так написал полноценный код на java -> потестил -> упаковал и все запускается и в 32 и 64 битном режиме без танцев с бубнами.

    Reply
  27. minimajack

    Добавлено видео по работе с СКД в клиент-северном варианте.

    Использовалась стандартная консоль СКД (разрешен вызов функций из общих модулей) на управляемых формах:

    В вычисляемые поля добавлено ВызватьJavaКлиент(«CompareDouble», Числа,&Поиск) — что приводит к вызову java функции с передачей параметров и возвратом результатов.

    Получаем вычисляемое поле с расстоянием Левенштейна в консоле СКД

    p.s. для 12000 строк, вызов функции происходил 36000 раз за 6,38 сек. на сервере

    Reply
  28. minimajack

    В публикацию добавлен пример написания простейшего плагина для чтения из Apache Kafka.

    Reply
  29. minimajack

    Архив обновлен, вместе с получателем добавлен демо-издатель Kafka.

    Прежде чем тыкать в Кафку, необходимо запустить зукипер и кафка-сервер, иначе будете ждать подключения…

    По нажатию на «Send to Kafka» — будет отправлено 10 000 пронумерованых сообщений на сервере (асинхронно). При ожиданиях между отправкой более 10 секунд издатель отправляет сообщение «Producer closed» и закрывается

    По нажатию на «Load from Kafka» — будет получено либо 500 сообщений с начала партиции (если пустое поле данных), либо произойдет ожидание 5 секунд для получения данных.

    Оба и издатель и подписчик обмениваются данными через топик «testTopic»

    Перформанс:

    1С + java — 3696 сообщений/сек

    Вызов без 1С на java — 36554 сообщений/сек

    Reply
  30. minimajack

    Путем нехитрых манипуляций удалось ускорить издателя до 8-10 тысяч сообщений в секунду.

    p.s. Архив обновлен

    p.p.s. К сожалению количество сообщений пришлось увеличивать до 20 тысяч что бы замерить скорость…так что жать кнопку «Load from Kafka» придется в два раза больше

    Reply
  31. o.nikolaev

    Очень круто. А какой-то полноценный стабильный релиз, который в проде можно использовать, есть?

    Reply
  32. minimajack

    (31) в проде не использовал, но сомневаюсь что могут быть какие то серьезные проблемы.

    Планировал выложить в опенсорс, но надо причесать исходники. А на это надо найти время.

    Reply
  33. o.nikolaev

    (32) А может ну его — причесывание — и выложить как есть 🙂 ? Уж очень завораживающая вещь получилась. Просто думаю нашлись бы люди которые занялись и причесыванием и развитием.

    Reply
  34. minimajack

    (33) я не первый раз выкладываю…что то энтузиастов не находилось.

    По факту мне надо убрать код проверки сертификата для паблика.

    Reply
  35. o.nikolaev

    (34) Так. Нет времени объяснять 🙂 Что я могу сделать чтобы вы выложили исходники в public ? 🙂

    Reply
  36. o.nikolaev

    Не получается воспроизвести примеры. Выдается сообщение «JVMLauncher : Cannot find class.». Можете подсказать что не так делаю?

    Reply
  37. o.nikolaev

    (36) Отвечаю сам же. Подключил папку subst-ом как диск d: и положил в нее Runner-0.0.1-SNAPSHOT.jar

    После этого пример заработал 🙂

    Reply
  38. minimajack

    Все верно. jar файлы загружаются из classpass(library dir)

    Исходники надо очистить от сертификата. Если все срочно — напишите в личку, соберу индивидуально

    Reply
  39. o.nikolaev

    (29) На видео у вас в обработке еще нет команды Send to Kafka. Но в cf-ке в публикации уже есть. В файловом варианте, чтобы добиться выполнения команды send to немножко исправил текст команды:

    &НаКлиенте
    Процедура SendToKafka(Команда)
    //SendToKafkaНаСервере();
    Для нумератор=1 По 20000 Цикл
    ОбъектВК.CallFInJVMPP(«KafkaExampleProducer»,Строка(нумератор),Строка(нумератор), 1);
    КонецЦикла;
    КонецПроцедуры
    

    Показать

    Подскажите, не по этому (https://dzone.com/articles/running-apache-kafka-on-windows-os) примеру все настраивали? 🙂

    Reply
  40. o.nikolaev

    (29) Все отлично работает. Спасибо!

    Reply
  41. o.nikolaev

    Ну и исходники Runner-0.0.1-SNAPSHOT.jar было бы бесценно скачать за SM вместе с выложенным примером. 🙂 Подхватить-то удается конечно, но жалуется что Source not found 🙂

    Reply
  42. o.nikolaev

    Глупый вопрос — а зачем подписывать jar файлы?

    Reply
  43. minimajack

    (42) затем, что демокомпонента проверяет подпись и не дает выполнить неподписанный код.

    Практически все исходники есть тут в качестве комментариев. Да и в любой ide можно глянуть…ничего там нет секретного)

    Reply
  44. o.nikolaev

    Еще вопрос — а предполагается развитие API? Чтобы все-таки можно было вызывать public методы java согласно их сигнатур? Еще вопрос: если, например в пакете в классе есть метод который возвращает значение типа другого класса, то можно ли помещать такое значение в переменную кода 1С и затем передавать в качестве параметра другому методу java-класса? Понимаю что можно это обойти создав, например void метод-обертку, который будет выполнять эту же операцию в самом java классе, но все-таки. Есть какие-то планы на этот счет?

    Reply
  45. minimajack

    Не вижу никакого смысла в вызове…ни скорости ни удобства.

    Апи планируется править, но точно не в эту сторону.

    Более рационально использовать как дополнение к native api — когда весь код заранее можно протестировать, а в 1с уже полноценно использовать

    Reply
  46. minimajack

    Добрался до компа…

    Просто создавая объекты java, вызывая методы мы теряем во всем.

    По сути вы хотите тот же Elisy.Net Bridge только на java.

    плюсы:

    — не надо собирать jar файлы

    — можно писать код типа на java

    минусы:

    — в 99% случаев все равно потребуются какие то библиотеки, и одно дело когда мы собираем так называемый UberJar — со всем вместе( а там и включаем свои классы), другое что нам придется прописывать все jar файлы ручками и следить за их версиями…

    — не возможно полноценное тестирование перед заливкой в 1С — юнит тесты и прочее проще организовать в java, а там и гит и все остальное из коробки.

    — сами себе режем производительность: interop вызовы не бесплатны, чем реже прыгать java -> 1C -> java и т.п. тем выше скорость решения

    — теряем в функциональности java — многие конструкции станут недоступны: try-with-resources, multicatch, case и т.п. это как вернутся в каменный век 🙂

    Reply
  47. minimajack

    https://gist.github.com/MinimaJack/8573b375a1f5121a06e5b03c53c6f6aa

    KafkaExampleProducer.java

    предпосылки:

    1. демо пример

    2. получить максимум производительности за минимально затраченное время на разработку

    Когда происходит вызов 1С, никакой отправки на самом деле не происходит, вместо этого:

    при каждом вызове проверяется java-поток на наличие, и если его нет происходит запуск

    при каждом вызове в очередь сообщений кладется сообщение

    Java-поток берет на себя обязательства по отправке сообщений, опустошает очередь отсылая сообщения, при отсутствии 10 сек сообщений отключается

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

    p.p.s На деле довольно таки стабильно отсылал сообщения. В прод не рекомендовал бы…но в свое время не выложил текст.

    Reply
  48. o.nikolaev

    (46) 🙂 Да, ступил. Это я уже потом и сам сообразил. Не столь развернуто правда 🙂

    Reply
  49. o.nikolaev

    (47) У меня ситуация такая что есть уже готовый профессиональный и отлаженный блок на Java для взаимодействия с Kafka и встала задача дотянуться до него из 1С-ки. Будем пробовать окучить сие с помощью компоненты.

    Reply
  50. minimajack

    Исходники доступны всем желающим

    https://github.com/MinimaJack/JVM-plugin

    Reply
  51. minimajack

    Существующий пример Kafka-получателя имел существенный недостаток.

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

    Решение такое же простое как и с отправителем -> запускаем поток который будет закрывать получателя после продолжительного интервала.

    Записал видео где два 1С клиента успешно общаются…

    https://www.youtube.com/watch?v=jMl66aurQeI

    Скорость конечно не супер, но 80001 сообщение со скоростью 2600 сообщений/сек доставлено(в видио есть вывод статистики по отправителю).

    Проверил в асинхронном режиме…вполне себе удобно.

      оповещение = Новый ОписаниеОповещения(«ЗавершитьПолучениеВсехДанных», ЭтотОбъект, «», «ЗавершитьПолучениеДанныхОшибка», ЭтотОбъект);
    ОбъектВК.НачатьВызовCallFInJVMPP(оповещение, «kafka.Consumer», 5, ПустаяСтрока(KafkaData), «»);
    

    Да, и теперь классы можно адекватно раскладывать по пакетам…kafka.Consumer, kafka.Producer, kafka.ProducerMetrics

    Reply
  52. o.nikolaev

    (51) А Kafka разве сама (сам) не отслеживает активность consumer-ов? Т.е. там если не хочешь влететь в ребалансировку надо непрерывно опрашивать. Ну дык на то она и «потоковая работа с данными» как я понимаю.

    Reply
  53. minimajack

    (52) JVM — живет столько сколько живет процесс rphost

    Kafka выкинет только если heartbeat — перестанет поступать…а что ему не поступать если Consumer так и останется запущенным и будет отправлять heartbeat.

    например:

    у нас 2 rphost-а(2 сервера или 2 процесса):

    на rphost#1 запустилось регламентное задание, запустился consumer#1, стал лидером — получил сообщения и ждет еще вызова из 1С…но в 1С регламентное задание завершилось. Неважно по какой причине…получены все сообщения или только определенный batch(1000 сообщений и хватит). JVM — продолжает работать, consumer#1 все так же сидит в лидерах и ждет от 1С приказов.

    на rphost#2 запускается регламентное задание, запустился consumer#2 ( другой процесс, другая JVM) и ждет пока станет лидером…и тут вопрос в kafke — когда и вообще сделает ли она ребалансировку consumer-ов так, что бы consumer#2 стал лидером и начал получать сообщения для регламентного задания на rphost#2.

    Решения два:

    1. со стороны 1C — закрывать consumer при завершении регламентного задания.

    минусы:

    если регламентное задание отрабатывает маленькими пачками и часто, будут переподключения к кафке и создания новых consumer-ов

    плюсы

    железно подключаемся одним consumer-ом

    2. со стороны java — закрывать consumer в другом потоке по истечении какого то интервала со времени последнего вызова.

    минусы:

    надо подбирать интервал согласно скорости обработки, если он будет меньше скорости обработки — consumer-ы переподключатся.

    Например 1С обрабатывает пачку за 10 секунд — можно поставить интервал в java 15 секунд(с последнего вызова). Если 1С затупит — старый закроется , создастся новый Consumer — совершенно без дополнительных телодвижений.

    плюсы

    если регламентное задание запускается чаще интервала, consumer будет переиспользоваться.

    Reply
  54. kickout

    Скачал либы, начал тестить, и есть несколько моментов. (64 разрядка)

    Небольшой итог по тому в чем удалось разобраться и чего тут не описано.

    1) в классе в яве который подключаем должен быть публичный статик метод(функция) mainInt()

    2) не удалось запустить не подписанный jar файл

    3)при попытке передать параметры говорит что «много фактических параметров»

    4) подписать jar файл пока не удалось

    Что пробовал делать я

    1) Создал хелоу ворлд свой на яве, вывел в отдельный класс, пишет что класс не найден.

    2) с прилоденным архивом пока тоже не получилось пораьотать, выходит ошибка но уже говорит «mainInt» т.е. класс находит, наверно дело в подписи jar файла

    Что делаю не так и какие еще есть нюансы использования dll?

    Качал последний архив, самый свежий.

    Reply
  55. minimajack
    Reply
  56. kickout

    (55)

    LaunchInJVMP

    Во… чуть стало понятнее, как вызывать с параметрами и без, но у меня теперь вот такая штука выходит

    Так я подключаюсь.

    &НаКлиенте
    Процедура test(Команда)
    имядлл = «C:	estNativeJVMJVMLauncher64.dll»;
    Если ПодключитьВнешнююКомпоненту(имядлл, «AddInNative»,ТипВнешнейКомпоненты.Native ) Тогда
    Сообщить(«Подключилась!»);
    ОбъектJvm = Новый(«AddIn.AddInNative.JVMLauncher»);
    ОбъектJvm.javaHome = «C:Program FilesJavajdk1.8.0_162»;
    ОбъектJvm.libraryDir = «C:	estNativeJVM»;
    ОбъектJvm.AddJar(«1cjvm.jar»);
    ОбъектJvm.LaunchInJVMP(«Testc»,456);
    КонецЕсли
    КонецПроцедуры
    

    Показать

    Reply
  57. kickout

    (56)

    Всё получилось, была путаница с методами, теперь вроде всё понял.

    Будем дальше тестить и что то изобретать))))

    Спасибо, за пояснения.

    Было бы классно если бы в публикацию добавили про вызов процедур и функций явы через 1с, а то путаница идет.

    И последний вопрос, как много можно передавать параметров?

    Поддерживаются только примитивные типы? (про массив и структуры пока можно мечтать или даже мечтание не поможет?))))

    Reply
  58. minimajack

    (57)

    В функцию можно до 4-х параметров, в процедуру можно до 2-х…

    Возможно увеличить если будет необходимость

    Ни массивы, ни структуры — сама 1С не даст отправить…точно работают строки, числа (int ,float, double)

    Возможен только возврат массива байт в Бинарные данные:

    CallFInJVMB  — byte[] mainInt()
    CallFInJVMBP — byte[] mainInt(param)  

    Все остальное только через сериализацию ЗначениеВСтрокуВнутр…

    Reply
  59. kickout

    (58)

    Дополню одной идеей, не знаю насколько это профитно,но…

    Как мне кажется удобнее будет переделать вызов класса и метода примерно вот так (Runner.getAll, , )

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

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

    вдруг в классе будет 2 и более метода которые можно выполнить, а то получается одна точка входа, а тут уже появляется выбор…

    да и городить тогда классы под каждый метод не надо будет.

    Reply
  60. minimajack

    (59) идея нормальная…

    Возможно реализовать альтернативным апи: ClassFunctionCall, ClassFunctionCallP,ClassFunctionCallPP

    По сути надо стандартизировать апи, а то сейчас есть разброс в именовании…

    Проще отправлять прямиком предложения в репо: https://github.com/MinimaJack/JVM-plugin/issues

    Reply
  61. minimajack

    (59) Добавлено

    Вызовы эквивалентны

    ОбъектВК.CallFInJVM(«time.utils.Current», ‘00010101’));
    ОбъектВК.ClassFunctionCall(«time.utils.Current.mainInt», ‘00010101’));
    

    time.utils — package

    Current — class

    mainInt — имя метода

    Тип Даты работает и в параметрах и в возвращаемом результате, с учетом адекватности на вхождение в unixtime интервал.

    Reply
  62. kickout

    (61)

    Огонь,а есть аналогичное для процедуры?

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *