Скомпилируйте проект Java в нативную библиотеку и создайте оболочку C / C++ поверх

  1. Я работаю над проектом C / C++.

  2. Я нашел в Интернете некоторые очень ценные ресурсы в виде библиотек Java, которые я хотел бы интегрировать в свой проект C / C++. Это большие проекты, которые я бы не рассматривал для переноса на C / C++.

  3. Я прочитал в сообщении Переполнение стека, что код Java может быть скомпилирован в собственный код, поэтому можно будет запустить проект Java, не имея виртуальной машины Java посередине. Я также обнаружил, что есть даже коммерческий инструмент для этого под названием ExcelsiorJET, что заставляет меня еще больше поверить в то, что это может быть надежным.

Принимая во внимание пункты 1, 2 и 3, я задавался вопросом, можно ли взять библиотеку Java, скомпилировать ее в собственную библиотеку, а затем создать оболочку C или C++ поверх этой библиотеки. Это означает, что таким образом виртуальная машина Java больше не понадобится. Таким образом я избавлюсь от уровня виртуальной машины Java. Возможно ли такое?

Я поискал в Интернете, чтобы узнать, создавал ли кто-нибудь когда-либо такой конвейер, но не смог прийти к выводу ...

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

Если это возможно, может ли кто-нибудь указать мне правильное направление?

Если эти библиотеки предписывают в API использование многих классов, то даже при переупаковке между C / C++ и Java это обременительно (даже если это делается автоматически). В идеале между обоими языками должно быть разделение, и, возможно, потребуется некоторая разработка на java. Это разработка с завязанной на спине рукой. Возможно, но смешивание будет дорогостоящим.

Joop Eggen 17.12.2018 14:21

Вы пробовали JIT. Он работает путем компиляции байт-кодов в машинный код во время выполнения. Вот ответ на переполнение стека, в котором подробно рассказывается об этом инструменте. stackoverflow.com/a/95679/7548672

user7548672 17.12.2018 15:14

В сети гораздо больше материалов для вызова машинного кода из Java (см. JNA и JNI), чем для других направлений. Возможно, вам удастся структурировать свое приложение как «драйвер» Java, который координирует вызовы вашего кода C и сторонней Java, которую вы хотите использовать.

dan.m was user2321368 17.12.2018 16:23

Вот интересное описание вызова Java из C++ через JNI (sweetcode.io/calling-java-code-from-cc-transparently), которое устранит необходимость в «драйвере» Java. (У него все еще работает JVM).

dan.m was user2321368 17.12.2018 16:42

@ dan.mwasuser2321368 Спасибо за ответ! Пожалуйста, поправьте меня, если я ошибаюсь, но вызов Java из C++ с использованием JNI подразумевает запуск кода Java на виртуальной машине. Я бы хотел избавиться от уровня виртуальной машины и иметь оболочку C или C++ поверх собственной библиотеки, полученной из кода Java.

Jacob Krieg 18.12.2018 16:17

@JacobKrieg - Да, в этом решении Java работает на виртуальной машине (JVM). Я никогда не сталкивался с Excelsior JET, но неясно, соответствует ли код, который он генерирует, соглашению о вызовах методов, которое ожидает компилятор C (например, "extern 'C'"), и т. д.

dan.m was user2321368 18.12.2018 16:50

@ dan.mwasuser2321368 Вы говорите, что теоретически вы можете получить доступ к коду, который генерирует Excelsior JET, используя соглашение о вызове методов, которое ожидает компилятор C, верно?

Jacob Krieg 18.12.2018 17:02

@JacobKrieg - Нет. Я говорю, что понятия не имею, так ли это.

dan.m was user2321368 18.12.2018 19:54
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
8
188
1

Ответы 1

Взгляните на JNI и последовательность запуска JVM: все это кодирование C / C++ на этом уровне.

Вы можете либо скомпилировать java заранее (AOT), либо вызвать JVM, как если бы это была библиотека (так работают исполняемые оболочки, такие как Launch4j).

Один из способов упростить взаимодействие Java / C / C++ - использовать IDL. После того, как вы определили свой интерфейс IDL, его можно использовать для генерации кода Java / C / C++.

Другие вопросы по теме