2017-08-14 35 views
0

我想從我的java程序中使用C庫(CFM-ID)。 C項目的bin文件夾中有可執行文件。 當我從終端運行C項目時,它的工作。Java進程總是返回-1

cd /home/lclab/cfm-svn/cfm/bin 
./fraggraph-gen CC 2 + fullgraph 

fraggraph-gen是可執行文件。然後我試着用我的java程序

Runtime rt = Runtime.getRuntime(); 
String command = "/home/lclab/cfm-svn/cfm/bin/fraggraph-gen CC 2 + fullgraph"; 
Process pr= rt.exec(command); 
InputStream in = pr.getInputStream(); 
System.out.println(in.read()); 

但它總是返回-1。 然後我創建了C程序並實現了可執行文件。

#include <stdio.h> 

int main(int argc, char *argv[]) { 

    if(argc == 2) { 
     printf("The argument supplied is %s\n", argv[1]); 
    } 
    else if(argc > 2) { 
     printf("Too many arguments supplied.\n"); 
    } 
    else { 
     printf("One argument expected.\n"); 
    } 
} 

並通過更改命令變量由我的Java程序執行它。

String command = "/home/lclab/Desktop/jni/test param1"; 

它的工作。請善待給我一個解決這個問題。由於

+1

注意,當你從終端運行程序輸入該程序的目錄。當你從你的Java程序運行它時,你不是。你的程序做什麼?它是否希望在自己的目錄中運行? (也許是因爲它訪問那裏的文件)。不知道你的C程序是做什麼的,很難幫助你。 –

+0

從'Process'的Javadoc:「從1.5開始,'ProcessBuilder.start()'是創建Process的首選方法。」 - 這不會解決這個特定的問題,但它將使處理過程更簡單。 – slim

+0

感謝您的建議。我以相同的順序執行了兩個C程序(使用終端和Java)。兩個程序都與終端一起工作,但只有測試程序正在使用java。圖書館不是。如何通過java運行C程序,哪個C程序在C項目中使用其他類? –

回答

0

繼調試步驟可以幫助你:你在你的dumy可執行提供

  1. 檢查參數。打印它們並與預期結果進行比較。

  2. 不要你需要使用WAITFOR:pr.waitFor()

  3. 您可能要打印錯誤流子進程:pr.getErrorStream()

  4. 從終端,首先更改目錄使用cd命令,但而不是從Java執行時。考慮推出之前執行的進程之前設置進程目錄,像ProcessBuilder

+0

謝謝你的建議。我爲我的測試C程序和C庫執行了相同的執行順序。首先,我嘗試了終端,然後用java。但它只能用於測試程序。測試程序是獨立程序,圖書館正在使用我認爲的另一類。它是不同的。如果可以請給出一些建議。感謝 –

+0

@ user3558507,理想情況下,從終端或Runtime()。exec()執行程序應該沒有區別。我只能想到兩個原因:A.'pwd'因爲缺少'cd'命令而不同。但這已經由您檢查過了。 B.檢查參數是否正確提供,注意在參數中有一個sigil +。另外,如果你可以給出確切的錯誤,這將是有幫助的。 –