1. 程式人生 > 其它 >java 呼叫gcc 和lldb 等shell程式的方法

java 呼叫gcc 和lldb 等shell程式的方法

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;
        });