在實際項目中,Java有時候須要調用C寫出來的東西,除了JNI之外,我認爲一種比較好的方法是JAVA調用Shell。先把C寫出來的make成可執行文件,而後再寫一個shell腳本執行該可執行文件,最後是JAVA調用該shell腳本。java
JAVA調用很簡單,例子以下:web
首先是shell腳本shell
- #!/bin/sh
- echo Begin word cluster
- /home/felven/word2vec/word2vec -train /home/felven/word2vec/resultbig.txt -output /home/felven/word2vec/classes.csv -cbow 0 -size 200 -window 5 -negative 0 -hs 1 -sample 1e-3 -threads 12 -classes 2000
- echo The word classes were saved to file classes.csv
而後是JAVA調用代碼app
- import java.io.BufferedReader;
- import java.io.InputStreamReader;
-
- public class RunShell {
- public static void main(String[] args){
- try {
- String shpath="/home/felven/word2vec/demo-classes.sh";
- Process ps = Runtime.getRuntime().exec(shpath);
- ps.waitFor();
-
- BufferedReader br = new BufferedReader(new InputStreamReader(ps.getInputStream()));
- StringBuffer sb = new StringBuffer();
- String line;
- while ((line = br.readLine()) != null) {
- sb.append(line).append("\n");
- }
- String result = sb.toString();
- System.out.println(result);
- }
- catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
其實就是一個Process類進行調用,而後把shell的執行結果輸出到控制檯下。eclipse
須要注意的是,在調用時須要執行waitFor()函數,由於shell進程是JAVA進程的子進程,JAVA做爲父進程須要等待子進程執行完畢。函數
另外在eclipse控制檯輸出時並非邊執行邊輸出,而是shell所有執行完畢後輸出,因此若是執行較爲複雜的shell腳本看到沒有輸出時可能會誤覺得沒有執行,這個時候看看終端裏面的進程,TOP命令一下就能看到其實shell腳本已經開始執行了。this