Вы можете вызвать исполняемый файл из Java. Просто вопрос:
String[] cmd = { "/path/to/program", "arg1", "arg2" };
Process proc = Runtime.getRuntime().exec( cmd );
Затем можно использовать proc
для связи с командой через стандартные потоки ввода-вывода и ожидания ее завершения.
Теперь, если вы хотите пойти по пути JNI, вам нужно написать некоторый дополнительный код, который будет действовать как уровень JNI между java и C. Этот уровень отвечает за отслеживание выделенной памяти C и преобразование между данными C типы и типы данных Java. Затем этот слой сможет вызывать функции из вашего другого исходного кода (но, вероятно, не основной функции). Затем вам нужно изменить / создать make-файл, который связывает ваш новый исходный код слоя JNI с исходным кодом, который у вас уже есть, в .dll / .so. Затем вам нужно написать класс (ы) java, которые находятся на вашем слое JNI.
Какой подход вы выберете, действительно зависит от того, что вы хотите, чтобы нативный код делал, и от того, сколько вам нужно взаимодействия с ним.