最近的一个项目需要使用到Java和C通信的,因为是在安卓上,所以我们能使用的方法有限(安卓上只支持部分Java,还有C也是精简的库)。
当然,使用本地Socket是一个简答你的解决办法。但是不是特别的优美。于是,我们准备使用Linux上使用的最多的管道进行通信。
之前查阅了一些资料,因为大部分网络上介绍Java管道的都是Java中的PipedStream,这个确实是管道类,但是很可惜,为了Java的操作
系统无关性,这个管道只适用于同一个JVM中,也就是说,他无法和其他VM或者是非Java语言进行交互。所以说,使用前还是需要看清JDK
说明文档。
如果想详细了解PIPE,可以参考这篇文章深入理解PIPE,当然,还有我们的维基百科
接下来开始说我的代码了。
先是Java代码:
这边,我是简单的开了一个BufferedOutputStream
,用来向管道中写入数据。
让我们来看一下C的代码:
这个就是相当简单了。熟悉Linux编程就知道,先mkfifo开一个管道,然后再进行读取。
然后我们看一下运行结果:
就是这样,Java中写向管道的数据被C语言得到了。不过,C向管道中写入数据,这部分还是在研究中。你们可以看看这篇文章 How to connect a C/C++ process to a Java application,他详细说明了几种
可以采用的方式,我也正在实验中。
Well,since your code is running on the Android, why don’t you use the JNI to call C code to achieve your function?
还有,为什么评论内容必须要包含中文。。。
@zale:因为,这个例子中,我们需要的是一个守护进程,开机运行,并且和init.d同生命周期.所以,依附于安卓肯定不好玩,而且,jni很多地方都有权限限制.与其绕过安卓的权限管理,还不如,直接搞root.
C端发消息,Java端接收消息怎么写呢