跳轉至內容

呼叫 C

75% developed
來自華夏公益教科書,一個開放的世界中的開放書籍

導航 高階 主題: v  d  e )


您可以使用 Runtime.exec() 方法在執行的 Java 應用程式中呼叫程式。Runtime.exec() 還允許您對程式執行操作,例如控制程式的標準輸入和輸出,等待其完成執行,以及獲取其退出狀態。

這是一個簡單的 C 應用程式,說明了這些功能。此 C 程式將從 Java 中呼叫

#include <stdio.h>

int main() {
    printf("testing\n");
    return 0;
}

此應用程式將字串“testing”寫入標準輸出,然後以 0 的退出狀態終止。要執行此簡單程式,請在 Java 應用程式中編譯 C 應用程式。

Computer code 編譯
$ cc test.c -o test

然後使用以下 Java 程式碼呼叫 C 程式

Computer code 程式碼清單 10.2:呼叫 C 程式。
import java.io.InputStream;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.io.InterruptedException;
import java.io.Process;
import java.io.Runtime;

import java.util.ArrayList;

public class ExecDemo {
    public static String[] runCommand(String cmd) throws IOException {
        // --- set up list to capture command output lines ---
        ArrayList list = new ArrayList();

        // --- start command running
        Process proc = Runtime.getRuntime().exec(cmd);

        // --- get command's output stream and
        // put a buffered reader input stream on it ---
        InputStream istr = proc.getInputStream();
        BufferedReader br = new BufferedReader(new InputStreamReader(istr));

        // --- read output lines from command
        String str;
        while ((str = br.readLine()) != null) {
            list.add(str);
        }

        // wait for command to terminate
        try {
            proc.waitFor();
        }
        catch (InterruptedException e) {
            System.err.println("process was interrupted");
        }

        // check its exit value
        if (proc.exitValue() != 0) {
            System.err.println("exit value was non-zero");
        }

        // close stream
        br.close();

        // return list of strings to caller
        return (String[])list.toArray(new String[0]);
    }

    public static void main(String args[]) throws IOException {
        try {

            // run a command
            String outlist[] = runCommand("test");

            // display its output
            for (int i = 0; i < outlist.length; i++)
                System.out.println(outlist[i]);
        }
        catch (IOException e) {
            System.err.println(e);
        }
    }
}

演示呼叫了一個方法 runCommand 來實際執行程式。

Example 程式碼部分 10.1:執行命令。
String outlist[] = runCommand("test");

此方法將輸入流掛鉤到程式的輸出流,以便它可以讀取程式的輸出,並將其儲存到一個字串列表中。

Example 程式碼部分 10.2:讀取程式的輸出。
InputStream istr = proc.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(istr));
             
String str;
while ((str = br.readLine()) != null) {
    list.add(str);
}

將 C 遷移到 Java

[編輯 | 編輯原始碼]

存在工具可以幫助將現有專案從 C 遷移到 Java。一般來說,自動翻譯工具分為兩種不同的型別

  • 一種將 C 程式碼轉換為 Java 位元組碼。它基本上是一個建立位元組碼的編譯器。它與任何其他 C 編譯器具有相同的步驟。另見 C 到 Java JVM 編譯器.
  • 另一種將 C 程式碼轉換為 Java 原始碼。這種型別更復雜,並使用各種語法規則來建立可讀的 Java 原始碼。對於希望將 C 程式碼遷移到 Java 並留在 Java 中的人來說,此選項是最好的。


Clipboard

待辦事項
新增一些示例。



華夏公益教科書