Вместо JNI, или JNI с некоторой помощью от автоматического генератора обертки, как SWIG или даже ЮНА, вы можете рассмотреть отделяя C/C++ и Java в отдельные процессы и использовать некоторую форму IPC и/или в Java Process
абстракция для вызова программы, написанной на C/C++. Такой подход отказывается от «обертывания», поэтому в некотором смысле это не ответ на этот вопрос, но, пожалуйста, прочитайте до голосования. Я считаю, что это разумный ответ на более широкую проблему в некоторых случаях.
Причина такого подхода заключается в том, что при вызове C/C++ непосредственно из Java JVM подвергается риску любой ошибки в собственном коде. Риск в какой-то степени зависит от того, какая часть собственного кода принадлежит вам и как вы ссылаетесь на сторонний код (и сколько у вас доступа к исходному коду такого стороннего кода).
Я столкнулся с ситуацией, когда мне пришлось вызывать библиотеку C/C++ из Java, а в библиотеке C/C++ были ошибки, которые вызвали сбой JVM. У меня не было исходного кода третьей стороны, поэтому я не смог исправить ошибки в собственном коде. В конечном итоге решение состояло в том, чтобы вызвать отдельную программу C/C++, связанную с третьей стороной библиотеки. Затем приложение Java совершило вызовы многих эфемерных родных процессов всякий раз, когда требовалось вызвать материал C/C++.
Если у нативного кода есть проблемы, возможно, вы сможете восстановить/повторить попытку в Java. Если нативный код завернут и вызван из процесса JVM, он может удалить всю JVM.
Этот подход имеет последствия для производительности/потребления ресурсов и, возможно, не подходит для вашего приложения, но его следует учитывать в определенных ситуациях.
Наличие отдельного приложения, которое выполняет функциональные возможности кода C/C++, потенциально полезно в качестве автономной утилиты и для тестирования. И наличие некоторой чистой командной строки или интерфейса IPC может облегчить будущую интеграцию с другими языками.
В качестве альтернативы вы можете попасть в native signal handling, чтобы уменьшить риски целостности процесса JVM, если вам нравится и придерживаться решения для упаковки.
Ваша общая проблема не может быть легко решена; преобразование каждого класса C++ по одному в классы Java через JNI довольно сложно. Почему вы хотите использовать эти классы C++ в Java? Есть ли причина, по которой вы должны использовать Java, но хотите иметь существующую функциональность? – templatetypedef
Я не хочу потерять функциональность моего C++. Он выполняет определенные функции, которые Java не может выполнять сам по себе, и я не знаю, как это сделать на Java. Поэтому я хотел бы интегрировать свой C++ внутри Java. :-) :-) –
«... Он выполняет определенные функции, которые Java не может сделать сам по себе ...» - я бы искренне поставил под сомнение это утверждение. «Не могу»? Доказательства, пожалуйста. – duffymo