当前位置: 首页 > news >正文

JNA封装C/C++动态库在flink内使用记录

概述

因为公司业务需求,需要将一部分原本已经用C/C++写好的程序封装到flink内部使用。

操作系统

CentOS 7

使用的技术和工具

flink 1.17.1
JDK 19.0.2
JNA 5.12.1
maven 3.9.4

技术实现

利用JNA将C/C++的程序封装到JAR包里面,然后结合flink依赖,打包运行即可。注意:JNA可以加载JAR包内部的so库

Q&A

Q:
1.Exception in thread “main” java.lang.reflect.InaccessibleObjectException: Unable to make field private final java.net.DatagramSocket java.net.DatagramSocket.delegate accessible: module java.base does not “opens java.net” to unnamed module @26f67b76

2.Exception in thread “main” java.lang.reflect.InaccessibleObjectException: Unable to make field private final byte[] java.lang.String.value accessible: module java.base does not “opens java.lang” to unnamed module @1a810908

3.Exception in thread “main” java.lang.reflect.InaccessibleObjectException: Unable to make field private final sun.nio.ch.DatagramChannelImpl sun.nio.ch.DatagramSocketAdaptor.dc accessible: module java.base does not “opens sun.nio.ch” to unnamed module @26f67b76

A:
执行的时候加上以下选项
–add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.util.concurrent=ALL-UNNAMED --add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED --add-opens=java.base/java.lang.reflect=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.math=ALL-UNNAMED --add-opens=java.base/java.net=ALL-UNNAMED --add-opens=java.base/sun.nio.ch=ALL-UNNAMED

Q:
java.lang.Exception: Could not create actor system
A:
百度发现是打包的flink依赖包版本不对(运行是1.17.1,JAR包用的是1.13.1)

Q:
Exception in thread “main” org.apache.flink.api.common.InvalidProgramException: java.io.FileDescriptor@3a82f6ef is not serializable. The object probably contains or references non serializable fields

A:
DatagramSocket对象内部存在不支持序列化的字段,所以不能定义为SourceFunction派生类的属性。
因为flink分布式的特性,所以JAR包内的类都需要支持序列化。
为了避免该问题,将DatagramSocket挪到run函数内部初始化即可

Q:
JNA加载动态库(以下称为主库)的时候,不会加载主库所依赖的其他动态库

A:
这种情况解决方法有以下几种
1. 导出LD_LIBRARY_PATH
2. 将主库所依赖的动态库编译成.a,一起打包到主库
3. 将依赖库所在的路径添加到能被搜索到的路径,具体请查看“参考链接”

参考链接

在JDK17尝鲜Flink1.17
flink1.12.2之后的版本和scala的兼容性问题
Linux下5种动态库运行时搜索路径的方法

http://www.lryc.cn/news/177205.html

相关文章:

  • Android gradle dependency tree change(依赖树变化)监控实现
  • 5个流程图模板网站,帮你轻松绘制专业流程图
  • 【AI视野·今日Robot 机器人论文速览 第四十二期】Wed, 27 Sep 2023
  • 后端面试关键问题大总结
  • uni-app:实现图片周围的图片按照圆进行展示
  • Django之视图
  • 【软件工程_设计模式】——为什么要使用设计模式?
  • 大数据之Kafka
  • 灵活运用OSI模型提升排错能力
  • 【最新!企知道AES加密分析】使用Python实现完整解密算法
  • 前端架构师之11_JavaScript事件
  • 文本过滤工具:grep
  • 【Linux】生产者和消费者模型
  • 开发APP的费用是多少
  • start()方法源码分析
  • VUE_history模式下页面404错误
  • 现代数据架构-湖仓一体
  • 最新AI写作系统ChatGPT源码/支持GPT4.0+GPT联网提问/支持ai绘画Midjourney+Prompt应用+MJ以图生图+思维导图生成
  • Python机器学习实战-特征重要性分析方法(5):递归特征消除(附源码和实现效果)
  • 如何快速走出网站沙盒期(关于优化百度SEO提升排名)
  • ATA-8000系列射频功率放大器——应用场景介绍
  • 2009-2018年各省涉农贷款数据(wind)
  • window.print()打印及出现的问题
  • Fedora Linux 39 Beta 预估 10 月底发布正式版
  • 【zookeeper】基于Linux环境安装zookeeper集群
  • 什么是IoT数字孪生?
  • 俄罗斯四大平台速卖通、Joom、Ozon 和 UMKA中国卖家如何脱颖而出!
  • destoon 调用第三方api接口
  • js中的类型转换
  • Oracle物化视图(Materialized View)