es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo ejecutar un archivo ejecutable de C desde Java en Linux-bash usando “jna” (no desde Windows-cmd)

para linux-text, solía hacer un esfuerzo así:

   ProcessBuilder p = new ProcessBuilder("/ruta/al/archivo/c/ejecutable");
   p.start();

pero tuve problemas con la entrada y salida.

Esta fue otra sugerencia:

Kernel32.java:

    public interface Kernel32 extends StdCallLibrary {

       ----
        };

        public Kernel32 INSTANCE = (Kernel32) Native.loadLibrary("Kernel32", Kernel32.class, WIN32API_OPTIONS);

    ----
    }

RunTest.java

    public class RunTest {

    ---

        static HANDLE inputFile = null;

        static void createChildProcess(String cmd){
            String szCmdline = cmd;

            PROCESS_INFORMATION processInformation = new PROCESS_INFORMATION();
            STARTUPINFO startupInfo = new STARTUPINFO();
  --
            // Crear el proceso hijo. 
            if (!Kernel32.INSTANCE.CreateProcess(
                --
                System.err.println(Kernel32.INSTANCE.GetLastError());
            }
            else {
                com.sun.jna.platform.win32.Kernel32.INSTANCE.WaitForSingleObject(processInformation.hProcess, 0xFFFFFFFF);

                ---
            }
        }

        static void WriteToPipe() 

        // Detener cuando no hay más datos. 
        { 
            IntByReference dwRead = new IntByReference();
     --

            for (;;) 
            { 

               --

                 }

Eso se volvió demasiado largo para probar así como la solución de jni, ¿hay alguna instrucción más sencilla?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El intento inicial de utilizar ProcessBuilder para ejecutar un archivo ejecutable en Linux resultó en problemas de entrada y salida. Otra solución sugerida implicaba utilizar Kernel32.java y RunTest.java con una implementación complicada.

    Si buscas unas instrucciones más sencillas, una posible solución es utilizar JNA para ejecutar directamente el comando de Linux. Aquí tienes un ejemplo de código que muestra cómo ejecutar un comando y obtener la salida estándar:

    import com.sun.jna.Library;
    import com.sun.jna.Native;
    
    public class RunCommand {
    
        private interface CLibrary extends Library {
            int system(String cmd);
        }
    
        public static void main(String[] args) {
            CLibrary libc = Native.load("c", CLibrary.class);
            int result = libc.system("ls");
            System.out.println("Código de salida: " + result);
        }
    }
    

    En este ejemplo, cargamos la biblioteca “libc” y utilizamos la función system para ejecutar el comando “ls”. El valor de retorno de system representa el código de salida del comando. Puedes modificar el comando para ejecutar cualquier archivo ejecutable o de script en tu sistema Linux.

    Ten en cuenta que este enfoque puede no funcionar para todos los escenarios o requisitos. Es importante entender las implicaciones de seguridad y las posibles limitaciones de ejecutar comandos de esta manera.

Comments are closed.