2.5.10 如何调用C/C++程序实现

我们知道,工头的giveTask和工人的doTask都是由开发者自己实现,如果采用C/C++实现的逻辑如何跟基于Java的框架交互呢?

方式一、采用脚本调用输出日志文件方式。

最直接的方式采用上一节讲述的进程调用方式,在工人实现里使用start或者tryStart调用C/C++的运行脚本,脚本运行结果输出到日志文件里,然后从工人通过获取日志文件的内容并返回给工头。

方式二、jni方式实现C/C++和Java交互。

过程如下:

1)编写带有native声明的方法的Java类。

2)使用javac命令编译所编写的Java类。

3)使用javah Java类名生成扩展名为h的头文件。

4)使用C/C++实现本地方法。

5)将C/C++编写的文件生成动态连接库。

在第4步中,C/C++实现可以通过JNIEnv*env去操作Java类和方法,JNIEnv可以当做一个面向C/C++的jni库。

方式三、socket的TCP/IP通信方式。

将C实现的算法逻辑包装成Socket Server,通过在工人的doTask里发送TCP通信包到C服务端,通过网络通信的方式实现交互。

综合建议:第一种方式最简单直接,对开发者没有太多要求,特别是C/C++实现的算法本身的输出结果就是文件的情况,采用第一种方式最合适。只有输入输出程序对象希望实现数据转换时才考虑第二、第三种方法。