java 调c语言代码_java中调用C语言代码

欢迎来到:http://observer.blog.51cto.com

第一步:搭建C语言开发环境了。

在此,个人使用的linux系统,介绍的linux的安装,windows的朋友可自行上网搜索。

linux下内置了编译器gcc,我们要做的只是写好c源文件然后在进行编译就可以了,但是如果没有gcc编译器的话,使用以下命令获取

~# sudo apt-get install gcc

同时要下载辅助工具

~# sudo apt-get install binutils

头文件库

~# sudo apt-get install Llibc6-dev

好了,C语言开发环境已经搭建完毕。

第二步:写好并编译c源文件

在此个人给一点小建议:C文件的编写与编译放在java开发项目底进行下,编译完成之后不要再移动编译文件,否则会出现各种各样的问题,比如我这里,一旦移动就必须给编译文件hello.exe在属性中赋予运行权限。比如以下的consider便为我的java项目名。

在此再给一点小提醒:C文件尽量在哪台机器上使用就在哪台机器上编译,因为不同的机器使用的可能是不同类的处理器和操作系统,如果是另外一台机器编译出来的,放到自己的机器上编译可能就会出现点问题。比如:一般不能先在自己的计算机上编译此程序,再把编译好的内容上载到 Web 服务器。因为自己的计算机可能是widows,而服务器一般为linux。

在此以编写文件:hello.c为例子:#include

#include

#include

int main()

{

char buf[1024];

while(1){

gets(buf);//标准输入流,输入字符串

printf("list: %s\n", buf);//标准输入流,将字符串输入

fflush(stdout); //fflush()用于对输出缓冲区进行刷新。

}

}

写好之后在控制台进入该文件目录,比如:

~# cd /home/roadahead/workspace/consider

接下来编译C源文件:

~# gcc hello.c -o hello.exe(hello.c是C源文件,hello.exe为编译后得到的运行文件)

测试文件是否可用:

~# $ ./hello.exe

hello

list: hello

nihao

list: nihao

^C

出现以上现象证明已经可以使用。

第三步:编写并运行java

在此使用eclipse编译工具,项目名:consider,文件名:CHelloWrod.java,上代码://:CHelloWrod.java

import java.io.BufferedInputStream;

import java.io.BufferedOutputStream;

import java.io.DataInputStream;

import java.io.File;

import java.io.IOException;

import java.io.PrintStream;

public class CHelloWrod {

final static int BUFFER_SIZE = 1024;

public byte[] resultBuf = new byte[BUFFER_SIZE];

public Process helloP;

public PrintStream nameList;

public DataInputStream addResult;

public CHelloWrod(){

String CPath = new File("").getAbsolutePath()+"/hello.exe";

//获取当前项目的路径,hello.exe放在项目根目录下,不管liunx还是widows都适用

System.out.println(CPath);

try {

helloP = Runtime.getRuntime().exec(CPath);

//为启动 C 程序,需要取得当前的 Runtime 对象。我们用它调用exec(),再由后者返回 Process 对象。

nameList = new PrintStream(new BufferedOutputStream(

helloP.getOutputStream()));

//获取C中的标准输入流,封装到java中

addResult = new DataInputStream(new BufferedInputStream(

helloP.getInputStream()));

//获取C中的标准输出流,封装到java中

} catch (IOException e) {

System.err.println("Cannot start listmgr.exe");

System.exit(1);

}

int byteCount;

for(int i=0; i<10; i++){

try {

System.out.println("I output hello"+i);

nameList.println("hello"+i);

//向C的标准输入流中输入字符串

nameList.flush();

byteCount = addResult.read(resultBuf);

//从C的标准输出流中得到反馈,存储于resultBuf中

String result = new String(resultBuf,0,byteCount).trim();

System.out.println(result);

} catch (IOException e) {

System.err.println("Communication error");

e.printStackTrace();

}

try {

Thread.sleep(1000);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

public static void main(String[] args) {

new CHelloWrod();

}

}

//:---;

代码意思在代码中已经说得很清楚了,这里就不多累赘,运行得到以下结果:

/home/roadahead/workspace/consider/hello.exe

I output hello0

list: hello0

I output hello1

list: hello1

I output hello2

list: hello2

I output hello3

list: hello3

I output hello4

list: hello4

I output hello5

list: hello5

I output hello6

list: hello6

I output hello7

list: hello7

I output hello8

list: hello8

I output hello9

list: hello9

证明运行正确,java调用C程序代码已经成功,至于该怎样利用就看个人了。

各位朋友,如果有什么不对的地方尽管指点,谢谢

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值