Я обнаружил, что самый простой подход - выполнить нативную программу из Java, а затем обмениваться данными через потоки ввода и вывода процесса.Это работает только для связи ASCII, что в большинстве случаев нормально.Этот подход работает на разных платформах.Если приложения запускаются независимо друг от друга, то файлы или сокеты являются кроссплатформенными и при желании будут работать с двоичными данными.
Всегда есть JNI или JNA, но обычно они лучше всего подходят для тесной связи между Java и нативным кодом.