2009-07-31 24 views
7

Tengo un programa Java que es principalmente GUI y muestra datos que se escriben en un archivo xml desde una herramienta de línea de comandos de C++. Ahora quiero agregar un botón al programa Java para actualizar los datos. Esto significa que mi programa tiene que llamar a la funcionalidad C++.Cómo llamar a la funcionalidad C++ desde java

¿Es la mejor manera de simplemente llamar al programa desde java a través de una llamada al sistema? El programa C++ se compilará para mac os y windows y siempre debe estar en el mismo directorio que el programa java.

Me gustaría generar un archivo ejecutable ¿Puede el programa c almacenarse dentro del contenedor y ser llamado desde mi programa?

Respuesta

5

Suponiendo que no hay mejor método de comunicación está disponible (SOAP, el ICE, zócalos, etc.), que yo llamaría el ejecutable usando Runtime.exec(). JNI se puede usar para interactuar directamente, pero yo no lo recomendaría. No, no puedes poner un ejecutable en el contenedor. Bueno, puedes, pero no puedes ejecutarlo, ya que el shell no sabe cómo ejecutarlo.

+1

¿Qué pasa con JNI? Está ahí por una razón, y definitivamente es mucho mejor en cuanto a rendimiento que comenzar un proceso por separado. –

+0

El problema con JNI es que si comete un error, su JVM puede bloquearse. Como en "segfault: code dumped". –

+2

@Pavel: acoplamiento menos portátil, menos estable y más ajustado – Draemon

6

Si tiene acceso al código y desea una experiencia "interactiva" con el programa externo (por ejemplo, realizar llamadas, obtener resultados, realizar llamadas adicionales), investigue JNI, que le permite llamar al código C o C++ desde Aplicación Java que incluye & que vincula el jugo JNI a su aplicación C o C++.

Ver:

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

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

Si realmente necesita una "aplicación de lanzamiento y obtener resultados" tipo de solución, echa un vistazo a Runtime.exec(), que le permite lanzar una el programa externo & captura su salida.

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

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

2

Para responder a su pregunta final, no puede ejecutar un ejecutable desde su jar.

Sin embargo, usted puede almacenarlo dentro de su jar y extraerlo a un directorio/archivo temporal antes de ejecutarlo (verifique su presencia por primera vez y extraiga si es necesario). Esto simplificará en cierto modo su distribución, ya que solo tiene que distribuir el contenedor y se asegura de que está ejecutando un archivo ejecutable que coincida con su código Java manipulado.

+0

Hice algo similar a esta vez. Funcionó bien, pero no estoy seguro si sería difícil si tu programa necesitara trabajar en diferentes plataformas. – sixtyfootersdude