当前有个需求,需要在Flink算子中调用c语言编写的算法,意思就是算子中执行的部分数据处理逻辑是调用c语言执行完成的。经调研,采用JNA调用c语言的.so文件,实现Flink算子调用C语言算法。
maven引入如下:
<dependency>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna</artifactId>
<version>4.1.0</version>
</dependency>
.so文件放在固定的目录下,jna会在固定目录下加载.so文件:
在Flink算子中调用.so算子代码示例如下:
public interface Clibrary extends Library{
// String path = Thread.currentThread().getContextClassLoader().getResource("sayhello").getPath();
Clibrary INSTANCE = (Clibrary) Native.loadLibrary("sayhello", Clibrary.class);
int sayHello();
int add(int a, int b);
String outputString(String str);
}
public class JNATest {
public static void main(String[] args) throws Exception {
//获取运行环境
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
//连接socket获取输入的数据
DataStreamSource<String> dataStreamSource = env.socketTextStream("server13", 9001);
SingleOutputStreamOperator<Integer> map = dataStreamSource.map(s -> {
String[] split = s.split(",");
return Clibrary.INSTANCE.add(Integer.parseInt(split[0]), Integer.parseInt(split[1]));
});
map.print();
env.execute("hello");
}
}