Вместо JNI или JNI с некоторой помощью от автоматического генератора оболочек, такого как SWIG, или даже JNA, вы могли бы рассмотреть возможность разделения C / C ++ и Java на отдельные процессы и использование некоторой формы IPC и/ или Process
абстракция Java для вызова программы, написанной на C / C ++.Этот подход отказывается от «обертывания», так что в некотором смысле это не ответ на этот вопрос, но, пожалуйста, прочитайте его перед повторным голосованием.Я считаю, что в некоторых случаях это разумный ответ на более широкий вопрос.
Причина такого подхода заключается в том, что когда вы вызываете C / C ++ непосредственно из Java, JVM подвергается рискулюбая ошибка в нативном коде .Риск зависит в некоторой степени от того, какой объем нативного кода принадлежит вам, и сколько вы ссылаетесь на сторонний код (и сколько у вас есть доступ к исходному коду такого стороннего кода).
Я выполнилв ситуации, когда мне пришлось вызывать библиотеку C / C ++ из Java, а в библиотеке C / C ++ были ошибки, которые вызывали сбой JVM.У меня не было стороннего исходного кода, поэтому я не мог исправить ошибки в нативном коде.Возможным решением было вызвать отдельную программу на C / C ++, связанную со сторонней библиотекой.Затем Java-приложение вызывало множество эфемерных нативных процессов всякий раз, когда ему было необходимо вызвать материал C / C ++.
Если у нативного кода есть проблема, вы можете восстановить / повторить в Java.Если нативный код обернут и вызван из процесса JVM, он может уничтожить всю JVM.
Этот подход влияет на производительность / потребление ресурсов и может не подходить для вашего приложения, но он того стоитрассмотрение в определенных ситуациях.
Наличие отдельного приложения, которое реализует функциональность кода C / C ++, потенциально полезно в качестве отдельной утилиты и для тестирования.А наличие чистого интерфейса командной строки или интерфейса IPC может упростить будущие интеграции с другими языками.
В качестве другой альтернативы вы можете воспользоваться обработкой нативного сигнала , чтобы снизить риски для целостностиПроцесс JVM, если вам нравится, и придерживайтесь упаковочного решения.