para linux-text, solía hacer tal esfuerzo:
ProcessBuilder p = new ProcessBuilder("/path/to/file/c/executable"); p.start();pero tuve problemas de 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(); -- // Create the child process. 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() // Stop when there is no more data. { IntByReference dwRead = new IntByReference(); -- for (;;) { -- }Eso fue demasiado largo para probar lo mismo que la solución jni , ¿hay alguna instrucción más simple ?
No necesita JNA o JNI (excepto según lo implemente el JDK) para ejecutar un comando. Es tan simple como usar Runtime.exec() y capturar la salida.
He implementado esto en una clase aquí . Los bits que necesita se simplifican a continuación.
public static List<String> runNative(String[] cmdToRunWithArgs, String[] envp) { Process p = null; try { p = Runtime.getRuntime().exec(cmdToRunWithArgs, envp); return getProcessOutput(p); } catch (SecurityException | IOException e) { // handle exception } finally { // Ensure all resources are released if (p != null) { p.destroy(); // also closes streams except... // on Windows and Solaris must close streams separately } } return Collections.emptyList(); // or throw exception } private static List<String> getProcessOutput(Process p) { ArrayList<String> sa = new ArrayList<>(); try (BufferedReader reader = new BufferedReader( new InputStreamReader(p.getInputStream(), Charset.defaultCharset()))) { String line; while ((line = reader.readLine()) != null) { sa.add(line); } p.waitFor(); } catch (IOException e) { // handle exception } catch (InterruptedException ie) { // handle exception Thread.currentThread().interrupt(); } return sa; }Entonces solo llama
String[] envp = new String[] { "LC_ALL=C" }; String[] cmd = new String[] { "/path/to/cmd", "arg1", "arg2" }; List<String> output = runNative(cmd, envp);