一开始,我想用jni实现这一功能,我的代码如下:
         int status = 0, retval= 0;

pid_t child;


child = fork();

if(child == -1){
return -1;
}else if(child == 0){
retval = execve(cmdpath, argv, NULL);
exit(retval);
}else{
waitpid(child, &status, 0);
printf("In father status = %.8x\n", status);
}            不过发现status的值始终是0,相同的代码再C中调用是成功的,返回status > 0的值.本人还是新手,望高手指点! 还有问题真的有点急, 万分感谢!

解决方案 »

  1.   

    ?? 楼上的高手,可以详细指点吗?我在JSP上调用的,操作系统是linux2.4跟环境有关系吗?
      

  2.   

    用jni可以,不管你是什么平台都可以,但是C要先打包成dll
      

  3.   

    我试过了,命令可以执行!不过status的值,总是被设置成0;或者你看看我这段试验代码,和它的打印信息 nt status = 0;

    pid_t child;


    child = fork();

    if(child == -1){
    return -1;
    }else if(child == 0){
    printf("This is child\n");
    printf("child is pid = %d\n",getpid());
    exit(7);
    }else{

    while( ( (child=wait(&status)) == -1 )&(errno==EINTR)); 

    if(child == -1) {
    printf("Wait Error:%s\n",strerror(errno)); 
    }else if(!status){ 
    printf("Child %ld terminated normally return status is zero\n", child); 
    }else if(WIFEXITED(status)) {
    printf("Child %ld terminated normally return status is %d\n", child,WEXITSTATUS(status)); 
    }else if(WIFSIGNALED(status)){ 
    printf("Child %ld terminated due to signal %d znot caught\n", child,WTERMSIG(status)); 
    }


    }
    在C下面输出的结果:This is child
    child is pid = 11055
    Child 11055 terminated normally return status is 7
    jni调用的结果:
    ****TestAction
    This is child
    child is pid = 11152
    Wait Error:No child processes
      

  4.   

    可以,把c做成dll,要把dll路径配置到环境变量
      

  5.   

    你可能不太了解JNI的原理,在java中调用C方法是可以的,java中定义native方法,native方法用c实现,但要把这些c方法放到一个dynamical library中,window下为*.dll, linux下为*.so
      

  6.   

    我已经编译成.so了,so也放在了JRE的动态连接库中, 同时已经成功调用了一些其它的很多函数!
    我想强调的是一个问题,命令已经执行了并且打印了信息,不过父进程中未能得到子进程退出时的值.
    还有的是如果直接用java的Runtime.exe()调用的话是没问题的,可以得到命令的返回值,代码如下:public class Command{
         public static int exec(String args[]){
    try{
    Process process = Runtime.getRuntime().exec(args);
    int retval = process.waitFor();
    print("***exec retval = " + retval);
    process.destroy();  
    return retval;
    }catch(Exception e){
    System.out.println(e);
    return -1;
    }
    }
    }其中必有猫腻!
      

  7.   

    可以的 我以前用过 把c打包成dll用jni调用
    我调用是成功的 网上有很多关于着放慢的介绍 自己找印象比较深
      

  8.   

    需要用到jni吗?就是一个命令么
    java有runtime可以直接调用命令的
            Process process = Runtime.getRuntime().exec("dir");
            process.getInputStream();
            process.getOutputStream();可以通过process获得输入输出,这样可以直接拿到结果
      

  9.   

    http://java.sun.com/docs/books/tutorial/native1.1/stepbystep/index.html
    必须是标准的jni输入输出,在c中必需把指针值转换成基本数据类型才能实现c与java之间信息传递。
      

  10.   

    laughsmile(海边的星空) 可以说的详细一点吗?
    Wait Error:No child processes!是在C里面的wait()函数打印出来的错误,此时还没有和JAVA通讯!
      

  11.   

    在linux先编译成so文件。之后再写一个jni的so去封装。java再用这个so就OK了
      

  12.   

    //用jni可以,不管你是什么平台都可以,但是C要先打包成dll
    这只是在windows下吧.
    以前看过一文章叫做 JNI完全手册 你google一下.希望对你有帮助