2009-07-31 5 views
7

Ho un programma Java che è principalmente GUI e mostra i dati che vengono scritti in un file xml da uno strumento da riga di comando C++. Ora voglio aggiungere un pulsante al programma java per aggiornare i dati. Ciò significa che il mio programma deve chiamare la funzionalità C++.Come chiamare la funzionalità C++ da java

È il modo migliore per chiamare semplicemente il programma da Java tramite una chiamata di sistema? Il programma C++ verrà compilato per mac os e windows e dovrebbe sempre essere nella stessa directory del programma java.

Vorrei generare un eseguibile il programma c può essere memorizzato all'interno del contenitore e chiamato dal mio programma?

risposta

5

Supponendo che nessun metodo di comunicazione migliore è disponibile (SOAP, ICE, prese di corrente, ecc), lo chiamerei l'eseguibile utilizzando Runtime.exec(). JNI può essere usato per interfacciarsi direttamente, ma non lo raccomanderei. No, non puoi mettere un eseguibile nel barattolo. Beh, puoi, ma non puoi eseguirlo, dal momento che la shell non sa come eseguirlo.

+1

Cosa c'è che non va con JNI? È lì per un motivo, ed è sicuramente molto più performante rispetto all'avvio di un processo separato. –

+0

Il problema con JNI è che se si commette un errore, la JVM è soggetta a crash. Come in "segfault: codice scaricato". –

+2

@Pavel: meno portatile, meno stabile, accoppiamento più stretto – Draemon

6

Se si ha accesso al codice e si desidera un'esperienza "interattiva" con il programma esterno (ad esempio, effettuare chiamate, ottenere risultati, effettuare chiamate aggiuntive), ricercare JNI, che consente di chiamare il codice C o C++ da un Applicazione Java includendo & che collega il succo JNI all'app C o C++ con.

See:

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

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

Se davvero solo bisogno di un "lancio app e ottenere risultati" sorta di soluzione, check-out Runtime.exec(), che consente di avviare un il programma esterno & acquisisce l'output.

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

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

2

Per rispondere alla tua domanda finale, non è possibile eseguire un eseguibile dal tuo contenitore.

Tuttavia, è possibile aggiungere all'interno del contenitore e estrarlo in una directory/file temporaneo prima di eseguirlo (controllare la presenza per la prima volta ed estrarre se necessario). Ciò semplificherà la tua distribuzione, in quanto hai solo il jar da distribuire, e assicurati che tu stia eseguendo un eseguibile che corrisponda al tuo codice Java jarred.

+0

Ho fatto qualcosa di simile a questo una volta. Ha funzionato bene, ma non sono sicuro che sarebbe difficile se il tuo programma dovesse funzionare su piattaforme diverse. – sixtyfootersdude