Я работаю над проектом C / C++.
Я нашел в Интернете некоторые очень ценные ресурсы в виде библиотек Java, которые я хотел бы интегрировать в свой проект C / C++. Это большие проекты, которые я бы не рассматривал для переноса на C / C++.
Я прочитал в сообщении Переполнение стека, что код Java может быть скомпилирован в собственный код, поэтому можно будет запустить проект Java, не имея виртуальной машины Java посередине. Я также обнаружил, что есть даже коммерческий инструмент для этого под названием ExcelsiorJET, что заставляет меня еще больше поверить в то, что это может быть надежным.
Принимая во внимание пункты 1, 2 и 3, я задавался вопросом, можно ли взять библиотеку Java, скомпилировать ее в собственную библиотеку, а затем создать оболочку C или C++ поверх этой библиотеки. Это означает, что таким образом виртуальная машина Java больше не понадобится. Таким образом я избавлюсь от уровня виртуальной машины Java. Возможно ли такое?
Я поискал в Интернете, чтобы узнать, создавал ли кто-нибудь когда-либо такой конвейер, но не смог прийти к выводу ...
Я хотел бы спросить, возможен ли этот конвейер, по крайней мере теоретически, если в сети нет примеров людей, успешно его создающих.
Если это возможно, может ли кто-нибудь указать мне правильное направление?
Вы пробовали JIT. Он работает путем компиляции байт-кодов в машинный код во время выполнения. Вот ответ на переполнение стека, в котором подробно рассказывается об этом инструменте. stackoverflow.com/a/95679/7548672
В сети гораздо больше материалов для вызова машинного кода из Java (см. JNA и JNI), чем для других направлений. Возможно, вам удастся структурировать свое приложение как «драйвер» Java, который координирует вызовы вашего кода C и сторонней Java, которую вы хотите использовать.
Вот интересное описание вызова Java из C++ через JNI (sweetcode.io/calling-java-code-from-cc-transparently), которое устранит необходимость в «драйвере» Java. (У него все еще работает JVM).
@ dan.mwasuser2321368 Спасибо за ответ! Пожалуйста, поправьте меня, если я ошибаюсь, но вызов Java из C++ с использованием JNI подразумевает запуск кода Java на виртуальной машине. Я бы хотел избавиться от уровня виртуальной машины и иметь оболочку C или C++ поверх собственной библиотеки, полученной из кода Java.
@JacobKrieg - Да, в этом решении Java работает на виртуальной машине (JVM). Я никогда не сталкивался с Excelsior JET, но неясно, соответствует ли код, который он генерирует, соглашению о вызовах методов, которое ожидает компилятор C (например, "extern 'C'"), и т. д.
@ dan.mwasuser2321368 Вы говорите, что теоретически вы можете получить доступ к коду, который генерирует Excelsior JET, используя соглашение о вызове методов, которое ожидает компилятор C, верно?
@JacobKrieg - Нет. Я говорю, что понятия не имею, так ли это.
Взгляните на JNI и последовательность запуска JVM: все это кодирование C / C++ на этом уровне.
Вы можете либо скомпилировать java заранее (AOT), либо вызвать JVM, как если бы это была библиотека (так работают исполняемые оболочки, такие как Launch4j).
Один из способов упростить взаимодействие Java / C / C++ - использовать IDL. После того, как вы определили свой интерфейс IDL, его можно использовать для генерации кода Java / C / C++.
Если эти библиотеки предписывают в API использование многих классов, то даже при переупаковке между C / C++ и Java это обременительно (даже если это делается автоматически). В идеале между обоими языками должно быть разделение, и, возможно, потребуется некоторая разработка на java. Это разработка с завязанной на спине рукой. Возможно, но смешивание будет дорогостоящим.