-----------------------------2018.2.4-------------------------------
失眠半晚作出放弃JNI的决定之后,神清气爽地一觉睡到12点orz
设想一个用例:
布置作业:让学生实现一个返回双精度数平方的函数。学生通过网页的某textarea提交一个函数,后端获取学生提交的函数并测试它的正确性。
极简例如下:
文件"D:\gcc-workspace\function.c":
double sqr(double x){
return x*x;
}
文件"D:\gcc-workspace\caller.c":
#include<stdio.h>
extern double sqr(double x);
int main(){
double y = sqr(3.0);
printf("%f\n",y);
printf("hello world!\n");
system("pause");
return 0;
}
CMD输入:(这个命令可优化:对于没有变化的caller.c,在预编译、编译、汇编、链接四步中的某一步及其之前的步骤是可省的。我猜是该步骤是汇编)
gcc d:\gcc-workspace\function.c d:\gcc-workspace\caller.c -o d:\gcc-workspace\hhh
双击"D:\gcc-workspace\hhh.exe",肉眼观察到
9.000000
hello world!
请按任意键继续. . .
人工检查function.c的过程至此完毕。
当然了,这个例子是一个最小集,以后需要面对的是多种题型,多个测试用例,以及大量文件。
人工检查是低效率的,之后应该做的是复习C的文件操作,将结果记录到文件系统中让java来做比较。
java可以操作cmd,所以剩下的全交给java即可。
顺便,java操作命令行的demo如下:
package cn.edu.nju.zyf.cmddemo;
import java.io.IOException;
public class CMDTest {
public static void main(String[] args) {
Process process = null;
try {
String compileCommand = "gcc d:\\gcc-workspace\\function.c d:\\gcc-workspace\\caller.c -o d:\\gcc-workspace\\hehehe411";
process = Runtime.getRuntime().exec(compileCommand);
process.waitFor();
System.out.println(process.exitValue());
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
if(process!=null) {
process.destroy();
}
}
}
}
------输入命令后,cmd会将此命令的正确结果或错误结果输出到console。注意一下这里的输出结果有正确和错误之分。------
package cn.edu.nju.zyf.cmddemo;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class CMDTest {
public static void main(String[] args) {
Process process = null;
BufferedReader br1 = null;
BufferedReader br2 = null;
try {
String compileCommand = "gcc -h";//这是一条不正确的指令。正确的指令是gcc --help
process = Runtime.getRuntime().exec(compileCommand);
process.waitFor();
br1 = new BufferedReader(new InputStreamReader(process.getInputStream()));
br2 = new BufferedReader(new InputStreamReader(process.getErrorStream()));
String line = null;
while((line = br1.readLine())!=null) {
System.out.println(line);
}
while((line = br2.readLine())!=null) {
System.out.println(line);
}
System.out.println(process.exitValue());
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
if(process!=null) {
process.destroy();
}
}
}
}