java程序如何跟C程序进行进程通信

问题描述

java程序负责接受和显示数据C程序负责处理数据例如:java程序接受到数据:a+b=?,然后调用C程序,将这个数据传给C程序,C程序处理后并把结果返回给java程序。这个过程怎么实现?管道通信?最好能给段代码。

解决方案

解决方案二:
http://topic.csdn.net/t/20030806/21/2117177.html你看看这个满足要求吗
解决方案三:
用线程
解决方案四:
LZ看看这编文章http://baike.baidu.com/view/1272329.htm1。java和c是如何互通的?  其实不能互通的原因主要是数据类型的问题,jni解决了这个问题,例如那个c文件中的jstring数据类型就是java传入的String对象,经过jni函数的转化就能成为c的char*。  对应数据类型关系如下表:  Java类型本地c类型说明booleanjboolean无符号,8位bytejbyte无符号,8位charjchar无符号,16位shortjshort有符号,16位intjint有符号,32位longjlong有符号,64位floatjfloat32位doublejdouble64位voidvoidN/A  JNI还包含了很多对应于不同Java对象的引用类型如下图:  2.如何将java传入的String参数转换为c的char*,然后使用?  java传入的String参数,在c文件中被jni转换为jstring的数据类型,在c文件中声明char*test,然后test=(char*)(*env)->GetStringUTFChars(env,jstring,NULL);注意:test使用完后,通知虚拟机平台相关代码无需再访问:(*env)->ReleaseStringUTFChars(env,jstring,test);  3.将c中获取的一个char*的buffer传递给java?  这个char*如果是一般的字符串的话,作为string传回去就可以了。如果是含有’’的buffer,最好作为bytearray传出,因为可以制定copy的length,如果copy到string,可能到’’就截断了。  有两种方式传递得到的数据:  一种是在jni中直接new一个byte数组,然后调用函数(*env)->SetByteArrayRegion(env,bytearray,0,len,buffer);将buffer的值copy到bytearray中,函数直接returnbytearray就可以了。  一种是return错误号,数据作为参数传出,但是java的基本数据类型是传值,对象是传递的引用,所以将这个需要传出的byte数组用某个类包一下,如下:  classRetObj{publicbyte[]bytearray;}这个对象作为函数的参数retobj传出,通过如下函数将retobj中的byte数组赋值便于传出。代码如下:jclasscls;jfieldIDfid;jbyteArraybytearray;bytearray=(*env)->NewByteArray(env,len);(*env)->SetByteArrayRegion(env,bytearray,0,len,buffer);cls=(*env)->GetObjectClass(env,retobj);fid=(*env)->GetFieldID(env,cls,"retbytes","[B"]);(*env)->SetObjectField(env,retobj,fid,bytearray);  4.不知道占用多少空间的buffer,如何传递出去呢?  在jni的c文件中new出空间,传递出去。java的数据不初始化,指向传递出去的空间即可。[编辑本段]对JAVA传入数据的处理  1.如果传入的是bytearray的话,作如下处理得到buffer:  char*tmpdata=(char*)(*env)->GetByteArrayElements(env,bytearray,NULL);(*env)->ReleaseByteArrayElements(env,bytearray,tmpdata,0);
解决方案五:
这个题目很高深的,顶!
解决方案六:
感觉很难懂,看来要好好努力学习
解决方案七:
来学习

时间: 2024-10-31 22:44:00

java程序如何跟C程序进行进程通信的相关文章

Java与XML(二)用java编写xml的读写程序

xml|程序 Java与XML(二)用java编写xml的读写程序 这是读取xml文件的java程序,我调试好的.采用的是dom方式读取xml文件到Vector中.package src;import java.io.*;import java.util.Vector;import javax.xml.parsers.*;import org.w3c.dom.*;public class readxml { static Document document; private boolean va

C#程序提示“正由另一进程使用,因此该进程无法访问该文件”的解决办法

  这篇文章主要介绍了C#程序提示"正由另一进程使用,因此该进程无法访问该文件"的解决办法,本文通过改写程序代码实现解决这个问题,需要的朋友可以参考下 问题描述: 图片加载后显示,然后进行删除操作时提示"--正由另一进程使用,因此该进程无法访问该文件.--" 解决办法: 原代码: 代码如下: iml.Images.Add(Image.FromFile(potopath + "" + fi.Name)); 改为: 代码如下: Image img =

java做了一个exe程序怎么通过监听返回运行程序的路径

问题描述 java做了一个exe程序怎么通过监听返回运行程序的路径 用java写了个程序,想实现开机启动的功能,方法是想写入注册表,但是我要怎么知道我打开的这个程序的路径,就是我要通过监听,然后程序打开开机启动功能怎么返回该程序的路径,明白我的意思吗,或者有其他方法也可以? 解决方案 可以通过两种方式解决: 1.String path = new File(".").getCanonicalPath(); 2.System.getProperty("user.dir"

Java通过JNI调用C++程序

JNI是Java Native Interface的缩写,中文为JAVA本地调用.使用JNI可以很方便的用我们的Java程序调用C/C++程序.很多时候,某些功能用Java无法 实现,比如说涉及到底层驱动的一些功能,这时候我们就可以利用JNI来调用C或者C++程序来实现,这就是JNI的强大之处.但是JNI也有它的缺点,使 用java与本地已编译的代码交互,通常会丧失平台可移植性. 下面是一个JNI例子,调用C++输出"hello world":   第一步:创建Java类,在里面定义一

堆栈 日志 反射-java能否动态的在程序中获得出错的值(入参)

问题描述 java能否动态的在程序中获得出错的值(入参) 现在想对项目中的日志进行改造.方便出问题时的解决效率.(出问题时每次都要对错误进行复现.尤其是流程很长的时候.花了大量的时间和精力). 举个简单的例子. public class 人 { private String 身高; private String 体重; private int 年龄; public String get身高() { return 身高; } public void set身高(String 身高) { this.

java画金字塔,但是程序无响应

问题描述 java画金字塔,但是程序无响应 import acm.program.*; import acm.graphics.*; public class jinzita extends GraphicsProgram{ public static final double BRICK_WIDTH=10; public static final double BRICK_HEIGHT=4; public static final double BRICK_IN_BASE=10; public

Java 菜单按钮控制绘图程序(求解答,急急急!!!)

问题描述 Java 菜单按钮控制绘图程序(求解答,急急急!!!) 用菜单和按钮来控制绘图 功能要求:实现简单绘图功能,具体要求:画直线,画空心或实心椭圆.画空心或实心矩形.画多边形(图形的位置和大小可在程序中设定). 界面要求:用图形界面实现. 图示一初始界面: 图示二使用菜单绘图: 图示三使用按钮绘图 解决方案 用 myeclipse 10 以上做吧 挺简单的,直接求代码,,不太好吧 解决方案二: http://download.csdn.net/download/wangjinxia00/2

职场-java web方面的初级程序员刚到公司很多不会怎么办

问题描述 java web方面的初级程序员刚到公司很多不会怎么办 大牛们求指点 本人刚从培训班出来 培训时感觉学的不错 但是上班后发现公司用的东西比较复杂 各种json的运用 xml的运用WebService 与dblink做服务交互 与数据传输 maven与GIT 这些以前培训班都没怎么接触过 现在感觉压力好大 想学 都不知道从哪里开始 现在每天都失眠 求指点 谢了 好心人求指点

如果我想在vs2010上运行mpi程序时控制用多少个进程运行,应该怎么做?

问题描述 如果我想在vs2010上运行mpi程序时控制用多少个进程运行,应该怎么做? 是在vs2010上直接控制,不是在mpich2上通过wmpiexe.exe程序控制,十分感谢!......... 解决方案 用多个进程运行的关键是进程间的数据交换和同步,这方面你可以用管道或者RPC来实现.

求解答- java语言想要运算器程序可以运行出正负数及小数点运算

问题描述 java语言想要运算器程序可以运行出正负数及小数点运算 public class Calculator { private CalcEngine engine; private UserGUI gui; public Calculator() { engine=new CalcEngine(); gui=new UserGUI(engine); } public void show() { gui.setVisible(true); } public static void main(