2009-07-31 21 views
7

Mam program Java, który jest głównie GUI i pokazuje dane, które są zapisywane do pliku xml z narzędzia wiersza poleceń C++. Teraz chcę dodać przycisk do programu java, aby odświeżyć dane. Oznacza to, że mój program musi wywoływać funkcję C++.Jak wywołać funkcję C++ z java

Czy można po prostu wywołać program z poziomu Java poprzez wywołanie systemowe? Program C++ zostanie skompilowany dla Mac OS i Windows i powinien zawsze znajdować się w tym samym katalogu, co program java.

Chciałbym wygenerować plik wykonywalny, czy program c może być przechowywany w słoiku i wywoływany z mojego programu?

Odpowiedz

5

Zakładając, nie ma lepszego sposobu komunikacji jest dostępny (SOAP, ICE, gniazda, itp), Nazwałbym wykonywalny korzystając Runtime.exec(). JNI może być użyty do bezpośredniego interfejsu, ale nie poleciłbym tego. Nie, nie możesz umieścić pliku wykonywalnego w słoiku. Cóż, możesz, ale nie możesz go uruchomić, ponieważ powłoka nie wie, jak go uruchomić.

+1

Co jest nie tak z JNI? Jest tam z jakiegoś powodu i jest zdecydowanie lepsza pod względem wydajności niż rozpoczęcie osobnego procesu. –

+0

Problem z JNI polega na tym, że jeśli popełnisz błąd, Twoja maszyna JVM może ulec awarii. Tak jak w "segfault: code dumped". –

+2

@Pavel: Mniej przenośne, mniej stabilne, mocniejsze sprzężenie – Draemon

6

Jeśli masz dostęp do kodu i chcesz mieć "interaktywne" doświadczenie z programem zewnętrznym (np. Zadzwoń, uzyskaj wyniki, wykonaj dodatkowe połączenia), zbadaj JNI, który pozwala na wywołanie kodu C lub C++ z Aplikacja Java zawierająca & łączenie soku JNI z aplikacją C lub C++.

Patrz:

http://en.wikipedia.org/wiki/Java_Native_Interface

http://www.acm.org/crossroads/xrds4-2/jni.html

Jeśli naprawdę potrzebujesz po prostu "app launch i uzyskać wyniki" rodzaju rozwiązania, sprawdź Runtime.exec(), która pozwala zapoczątkować program zewnętrzny & przechwytuje swoje wyjście.

Patrz: http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html?page=1

http://www.rgagnon.com/javadetails/java-0014.html

2

Aby odpowiedzieć na ostatnie pytanie, nie można uruchomić pliku wykonywalnego z poziomu słoika.

Możesz jednak może przechowywać go w swoim słoiku i wyodrębnić go do tymczasowego katalogu/pliku przed uruchomieniem go (sprawdzić jego obecność za pierwszym razem i wyodrębnić w razie potrzeby). Uprości to nieco dystrybucję, ponieważ masz tylko słoik do dystrybucji i zapewnia, że ​​uruchamiasz plik wykonywalny pasujący do twojego sękanego kodu Java.

+0

Zrobiłem coś podobnego do tego jeden raz. Działa dobrze, ale nie jestem pewien, czy byłoby to trudne, gdyby program był potrzebny do pracy na różnych platformach. – sixtyfootersdude

Powiązane problemy