Zamiast JNI lub JNI niektóre pomoc z automatycznym generatorem owijarki jak SWIG lub nawet JNA, można rozważyć oddzielenie C/C++ i Java w oddzielnych procesach i za pomocą jakiejś formy IPC i/lub Java Process
abstrakcja do wywołania programu napisanego w języku C/C++. Takie podejście porzuca "pakowanie", więc w pewnym sensie nie jest to odpowiedź na to pytanie, ale proszę przeczytać je przed głosowaniem w dół. Uważam, że jest to rozsądna odpowiedź na szerszy problem w niektórych przypadkach.
Powodem takiego podejścia jest to, że podczas wywoływania C/C++ bezpośrednio z Java, , JVM narażona jest na każdy błąd w kodzie macierzystym. Ryzyko zależy w pewnym stopniu od tego, ile kodu natywnego jest twoje i od tego, ile linkujesz do kodu strony trzeciej (i ile masz dostępu do kodu źródłowego takiego kodu strony trzeciej).
Zabrakło mi w sytuacji, gdzie musiałem zadzwonić do C/C++ biblioteki z Java i C/C++ biblioteka miała błędy, które spowodowały awarię JVM. Nie miałem kodu źródłowego strony trzeciej, więc nie mogłem naprawić błędów w natywnym kodzie. Ostatecznie rozwiązaniem było wywołanie osobnego programu C/C++, połączonego z biblioteką strony trzeciej. Aplikacja Java następnie wywoływała wywołania wielu efemerycznych procesów natywnych za każdym razem, gdy trzeba było wywoływać elementy C/C++.
Jeśli natywny kod ma problem, może być w stanie odzyskać/ponów w Javie. Jeśli kod natywny jest zawijany i wywoływany z procesu JVM, może on zniszczyć całą maszynę JVM.
To podejście ma wpływ na wydajność/zużycie zasobów i może nie być odpowiednie dla aplikacji, ale warto rozważyć w niektórych sytuacjach.
Posiadanie osobnej aplikacji, która sprawdza funkcjonalność kodu C/C++, może być użyteczne jako samodzielne narzędzie i do testowania. A posiadanie jakiegoś prostego interfejsu wiersza poleceń lub IPC może ułatwić przyszłe integracje z innymi językami.
Jako inną alternatywę można uzyskać native signal handling w celu zmniejszenia ryzyka dla integralności procesu JVM, jeśli użytkownik lubi i pozostanie przy rozwiązaniu do pakowania.
Twój ogólny problem nie może być łatwo rozwiązany; Konwersja każdej klasy C++ pojedynczo na klasy Java poprzez JNI jest dość trudna. Dlaczego chcesz używać tych klas C++ w Javie? Czy jest jakiś powód, dla którego musisz używać Javy, ale chcesz istniejącej funkcjonalności? – templatetypedef
Nie chcę stracić funkcjonalności mojego C++. Wykonuje pewne funkcje, których Java nie może wykonywać samodzielnie i nie wiem jak to zrobić w Javie. Chciałbym zintegrować moje C++ w Javie. :-) :-) –
"... Wykonuje pewne funkcje, których Java nie może wykonywać samodzielnie ..." - Szczerze podważam to stwierdzenie. "Nie mogę zrobić"? Dowody, proszę. – duffymo