Встраивание JVM в приложение C ++: как правильно его связать? - PullRequest
1 голос
/ 03 августа 2020

Цель

Предположим, у нас есть большое приложение на C ++, которое выполняет некоторые большие задачи, которые можно выполнять с помощью C ++. Но существует множество логов c, которые мы бы предпочли запускать на JVM.

Проблема

Чтобы протестировать подход, описанный выше, я создал небольшой проект на C ++ с использованием CLion. Сценарий:

Сборка (автоматически с помощью CMake):

  • фрагмент кода ссылки с $JAVA_HOME/lib/jvm.lib
  • копирование всех DLL из $JAVA_HOME в каталог с только что созданным exe

Выполнить :

  • создать встроенную JVM
  • вызвать stati c

Я попробовал Visual Studio 2019 Community и MinGW64 (x86_64-8.1.0-posix-seh-rt_v6-rev0), и оба привели к идентичным результатам.

Лучшие результаты, которые я получил с OpenJDK ( jdk-14.0.2 ):

Error occurred during initialization of VM
Failed setting boot class path.

Oracle JDK 1.8 показал немного другую ошибку:

Error occurred during initialization of VM
Unable to load native library: Can't find dependent libraries

Я также пробовал разные версии из ojdkbuild , и лучшее, что я получил, это SEGFAULT при вызове env->FindClass.

Вопросы

  1. Какой дистрибутив JVM лучше использовать для встраивания в C ++?
  2. Как правильно связать и распределить все это?

Ответы [ 2 ]

1 голос
/ 03 августа 2020

Какой дистрибутив JVM лучше использовать для встраивания в C ++?

Во встраивании нет никакой разницы, поскольку большая часть из них - это просто код OpenJDK с небольшими изменениями.

Как правильно связать и распределить все это?

скопировать все DLL из $ JAVA_HOME в каталог с только что созданным exe

Это не сработает, поскольку JVM нужно намного больше.

Вам придется распространить часть JDK, только библиотеки DLL недостаточно, так как все библиотеки классов отсутствуют. Вы можете попробовать создать изображение меньшего размера с помощью jimage. Это будет включать в себя все соответствующие части (= JVM, библиотеки классов, собственные библиотеки)

Чтобы связать с JVM, вы делаете это правильно.

0 голосов
/ 06 августа 2020

Решение для Windows:

  1. напишите код C ++, который:
    1. включает <jni.h> из JDK.
    2. загружает "$ {JRE_HOME} / bin /server/jvm.dll "с использованием LoadLibrary из WinAPI.
    3. получает указатели на JNI_CreateJavaVM с использованием GetProcAddress из WinAPI.
    4. вызывает JNI_CreateJavaVM и делает все, что вы хотите, с JVM .
  2. скомпилируйте его с доступом к ${JAVA_HOME}/include/**/*.h.
  3. просто запустите скомпилированную программу.

Рабочий пример здесь: https://bitbucket.org/kkolyan/j4cpp/src/master/

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