2017-08-14 101 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 +。另外,如果你可以给出确切的错误,这将是有帮助的。 –