Вы можете встроить виртуальную машину Java непосредственно в программу C ++. JVM предоставляет API, который позволяет создавать экземпляры виртуальной машины в том же пространстве процессов, что и ваша собственная программа.
Однако вместо того, чтобы встраивать JVM в ваше нативное приложение, я думаю, что лучше сделать обратное: пусть JVM вызывает ваш нативный код.
Оба требуют использования собственного интерфейса Java (JNI), но в первом случае необходимо выполнить несколько дополнительных шагов в отношении собственных функций, доступных для виртуальной машины. Эти дополнительные требования могут быть трудно удовлетворить с крупными собственными приложениями.
См. главу 8.3 из Руководства по нативному интерфейсу Java:
8.3 Регистрация собственных методов
[...]
RegisterNatives особенно полезен, когда нативное приложение встраивает реализацию виртуальной машины и требует связи с нативной реализацией метода, определенной в нативном приложении. Виртуальная машина не сможет автоматически найти реализацию этого собственного метода, поскольку она выполняет поиск только в собственных библиотеках, а не в самом приложении.
Другими словами, все не родные методы dll_exported должны быть вручную зарегистрированы на ВМ. Это довольно тяжелое требование.