java 呼叫gcc 和lldb 等shell程式的方法
阿新 • • 發佈:2022-11-29
java 呼叫gcc 和lldb 等shell程式的方法,我這裡是呼叫的是gcc 的objdump工具 用於生成彙編程式碼
直接呼叫控制檯程式會出現死鎖的問題,java特色,所以封裝一下
封裝
package com.far.vms.opencar.utils; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.util.function.Function; /* * @description: * * 呼叫作業系統的Shell 需要相容mac linux win * * @author mike/Fang.J * @data 2022/11/29 */ public class ShellUtil { public static class RunShellThread implements Runnable { private InputStream inputStream; private Function<String, Integer> caller; public Function<String, Integer> getCaller() { return caller; } public RunShellThread setCaller(Function<String, Integer> caller) { this.caller = caller; return this; } public InputStream getInputStream() { return inputStream; } public RunShellThread setInputStream(InputStream inputStream) { this.inputStream = inputStream; return this; } @Override public void run() { InputStreamReader inputStreamReader = null; BufferedReader br = null; try { inputStreamReader = new InputStreamReader(inputStream); br = new BufferedReader(inputStreamReader); // 列印資訊 String line = null; while ((line = br.readLine()) != null) { caller.apply(line); //System.out.println(line); } } catch (IOException ioe) { ioe.printStackTrace(); } finally { try { br.close(); inputStreamReader.close(); } catch (IOException e) { e.printStackTrace(); } } } } /** * @param shellProgPath * @param args * @param caller * @description: * @return: void * @author mike/Fang.J * @data 2022/11/29 */ public static void runShell(String shellProgPath, String[] args, Function<String, Integer> caller) { try { Process p = Runtime.getRuntime().exec(args); //caller沒有考慮執行緒安全 new Thread(new RunShellThread().setCaller(caller).setInputStream(p.getInputStream())).start(); new Thread(new RunShellThread().setCaller(caller).setInputStream(p.getErrorStream())).start(); p.waitFor(); } catch (Exception e) { e.printStackTrace(); } } }
呼叫
String kr = "D:\\AAAA_WORK\\RISC-V-Tools\\os\\riscv-operating-system-mooc\\code\\os\\01-helloRVOS\\build\\kernel-img.img"; String buildTool = "D:\\AAAA_WORK\\RISC-V-Tools\\riscv64-unknown-elf-toolchain-10.2.0-2020.12.8-x86_64-w64-mingw32\\bin\\riscv64-unknown-elf-objdump.exe"; ShellUtil.runShell(buildTool, new String[]{buildTool,kr ,"-d"}, cmdInf -> { System.out.println(cmdInf); return 0; });