首页/新闻资讯/正文详情

JNA 版本演进全览:从 2.4 到 5.19 的变更日志深度解读

发布时间:2026/9/25 5:12:28 来源:云帆数科 栏目:资讯中心
JNA 版本演进全览:从 2.4 到 5.19 的变更日志深度解读
系统编程后端【免费下载链接】jnaJava Native Access项目地址https://gitcode.com/gh_mirrors/jn/jna点击查看免费下载本篇指南以 JNAJava Native Access官方仓库的 CHANGES.md 为核心骨架系统梳理 JNA 从 2.4 到 5.19.0 十余年的版本演进脉络并结合仓库源码Platform.java、Native.java 等解释关键变更背后的实现逻辑。读完本文你将能够快速定位某个能力如 RISC-V 支持、JPMS 构件在哪个版本引入、理解各版本重要变化/破坏性变更对升级的影响、掌握 JNA 运行时系统属性与平台适配机制从而在升级 JNA 或排查原生库加载问题时做到心中有数。一、先读两条总则许可证与二进制兼容性CHANGES.md开篇的两条 NOTE 是整个变更历史的世界观理解它们才能读懂后面所有版本记录。双许可证自 4.0 起JNA 4.0 之前是 LGPL 单一许可4.0 起改为 LGPL 2.1 与 Apache License 2.0 双许可开发者可自行选择适用协议仓库根目录的 LICENSE、LGPL2.1、AL2.0 三份文件即对应这一安排。这一点在src/com/sun/jna/Version.java的版权头注释中也能看到dual-licensed under 2 alternative Open Source/Free licenses: LGPL 2.1 or later and Apache License 2.0 (starting with JNA version 4.0.0)。JNI 原生层的版本兼容性JNI native 支持通常在小版本之间不兼容大版本之间几乎总是不兼容。这意味着 JNA 的 Java 层与libjnidispatch原生库必须匹配。多个版本的记录直接印证了这一点例如 5.14.0 明确写道The interfaces between Java and native code have changed, solibjnidispatchmust be rebuilt to be compatible with this release3.3.0 也注明该变更incompatible with all previous JNA native libraries。升级 JNA 时如果自定义构建了原生库必须同步重建。二、版本节奏与Next Release文档顶部保留了一个Next Release (5.20.0)的空骨架Features 与 Bug Fixes 均未填充说明这是一个仍在活跃开发的滚动变更日志。已发布版本从 5.19.0 一直回溯到 2.4跨越 3.x、4.x、5.x 三个大版本代际。整体趋势清晰2.x → 3.x奠定基础能力Unions、类型映射、libffi 多平台、直接映射雏形。3.x → 4.x引入 Apache 双许可、Java 6 默认级别、系统属性体系成型、platform模块win32/unix/mac大规模扩充。4.x → 5.xJDK 8 起跳、finalizer 退出历史舞台、架构矩阵大幅扩张RISC-V、LoongArch64、aarch64、DragonFlyBSD 等、JPMS/OSGi 现代化、Android 16KB 页大小适配。三、平台与 CPU 架构支持矩阵最活跃的演进主线CHANGES.md中数量最多的条目类别就是新增平台支持这与 JNA 的本质——通过 libffi 桥接 Java 与任意平台原生代码——完全一致。仓库lib/native/目录下 40 个*-*.jar如linux-loongarch64.jar、linux-riscv64.jar、freebsd-aarch64.jar、win32-aarch64.jar就是这份支持矩阵的实物证据。3.1 新架构的引入时间线版本新增平台/架构5.19.0OpenBSD 7.9 x86-64 重建放弃 OpenBSD x865.18.0Platform#isRISCV()Platform.java5.15.0FreeBSD aarch64、DragonFly BSD x86-64、linux-riscv64 进入 OSGi Bundle-NativeCode5.14.0linux-riscv64 改在 Ubuntu focal 上构建以兼容更老的 glibc5.12.0LoongArch645.8.0linux-riscv64 首度引入macOSRESOURCE_PREFIX改为darwin-$arch5.7.0macOS aarch64 纳入 universal darwin 目标Windows aarch644.5.0linux-mips64el、linux-s390x4.4.0armelARM EABI Little-endian区分硬浮点与软浮点4.2.1linux-sparcv94.2android aarch64 / x86-64 / mips / mips643.5.0android-arm3.4.0linux/arm、linux/ppc、linux/ia64、linux/ppc64、w32ce-arm3.2 源码中的架构归一化逻辑CHANGES.md中把 SAPJVM8 上报的zarch_64映射为s390x这类看似琐碎的修复在源码里对应Platform#getCanonicalArchitecture的归一化逻辑Platform.javai386/i686→x86、x86_64/amd64→x86-64、powerpc→ppc、zarch_64→s390x并且会根据sun.cpu.endian把ppc64修正为ppc64le。软浮点检测则在ELFAnalyser中完成3.5.0 的修复指出旧工具链产出的二进制缺少硬/软浮点标记Raspbian、Oracle JDK 均受影响因此判定逻辑同时参考 ARM EABI 段。Platform类因此暴露了isARM()、isLoongArch()、isRISCV()、isMIPS()、isPPC()等判定方法供上层使用。3.3 平台识别从常量到方法Platform用一组整型常量标识 OSPlatform.javaMAC/LINUX/WINDOWS/SOLARIS/FREEBSD/OPENBSD/WINDOWSCE/AIX/ANDROID/GNU/KFREEBSD/NETBSD/DRAGONFLYBSD。5.15.0 中DragonFlyBSD 纳入NativeLibrary版本化库解析、libc 特例加载和 64 位搜索路径对应 Native.java 中isDragonFlyBSD()与 Linux/Solaris/AIX/FreeBSD 等并列的搜索分支。macOS 的darwin-$arch前缀变更5.8.0 重要变化也体现在Platform.RESOURCE_PREFIX getNativeLibraryResourcePrefix()Platform.java旧前缀仍作为回退搜索位置。四、JDK 与运行环境要求的变化4.1 最低 JDK 的两次跃迁5.14.0正式放弃 JDK 6 和 7最低要求 JDK 8。5.18.0新增文档说明运行 JNA 需要 JDK 24对最新发布版而言同时修复了 Xcode 16.3 / Apple Clang 17 下的原生构建错误——这提醒我们构建环境和运行环境是两条独立的要求线。4.2 对 JDK 内部变化的适应JDK 104.0 时代javah被移除改用javac -h生成头文件构建最低要求升至 JDK 8而运行时仍兼容 Java 6。JEP 400 / JDK 185.10.0file.encoding默认改为UTF-8JNA 更新了原生编码检测逻辑以匹配。SecurityManager5.19.0移除对java.lang.SecurityManager/java.security.AccessController的硬依赖。这也呼应了更早的 3.0.9/4.0 中显式处理 Android 损坏的 SecurityManager 实现等历史包袱。反射兼容5.3.1ReflectionUtils不再通过反射访问java.lang.invoke.MethodType避免 Android API level 26 时抛NoClassDefFoundError。五、内存管理与对象生命周期的现代化JNA 涉及大量跨 JNI 边界的原生内存其生命周期管理策略是各版本反复打磨的重点5.12.0重要变化Memory#dispose、CallbackReference#dispose、NativeLibrary#dispose原先由Object#finalize调用现改为使用 Cleanerjava.lang.ref.Cleaner。副作用是不再保证子类 finalization 时一定调用dispose开发者应显式管理资源。5.14.0当最后一个 cleanable 被移除后关闭CleanerThread避免线程泄漏。5.12.1在Memory#close中对 cleanable 做 null 检查Memory.java。5.15.0修复free_callback的 JNI weak reference 泄漏。5.8.0确保从 Memory 间接得到的指针在解引用时保留其源对象引用防止被 GC 提前回收——这类防过早 GC修复贯穿始终如 4.3.0 中将整个对象传入 JNI 调用以阻止 Pointer/Function 被提前回收、3.1.0 中存在直接 NIO Buffer 映射时确保 Memory 不被 GC。六、直接映射Direct Mapping与性能路线JNA 提供两种调用模式接口映射interface mapping动态代理与直接映射direct mapping编译期生成桩代码。CHANGES.md记录了直接映射能力的逐步完善3.1.0引入静态 Java 方法的原始 JNI 映射文档明示其性能约为传统接口映射的10 倍但类型转换功能较少。3.2.0直接映射开始支持 String、Structure、Callback、Buffer、基本类型数组及 NativeMapped/TypeMapper含 IntegerType、PointerType 的优化路径。4.5.0直接映射支持boolean[]并新增OPTION_ALLOW_OBJECTS选项。5.3.0接口默认方法支持实验性。性能类改进还包括5.7.0 提升Memory分配性能与Structure#read/write性能5.16.0 为Structure增加字段列表缓存和可重入读写锁替换synchronized5.4.0 通过遍历可用构造函数而非异常处理提升Structure#newInstance4.2 中Library$Handler/Function减少锁竞争与 varargs 检查。七、关键系统属性与运行时配置源码级印证CHANGES.md在多个版本散布介绍了运行时系统属性这些属性在源码中都有直接对应汇总如下来源Native.java、NativeLibrary.java、Structure.java、Platform.java系统属性作用引入/变化版本源码位置jna.nosys是否加载系统预装 JNA默认自 5.0.0 起为true即默认用内嵌原生库3.4.0 引入5.0.0 改默认值5.2.0 Android 特例Native.javajna.boot.library.name覆盖jnidispatch原生库名3.4.0Native.javajna.nounpack禁止解包内嵌原生库Android 上由Platform自动置为 true3.4.0Native.java、Platform.javajna.debug_load打印库加载诊断4.0Native.javajna.encoding自定义原生字符串编码2.5 引入默认随后续 JEP400 演进2.5 引入5.10.0 适配 JDK18Native.javajna.library.path追加原生库搜索路径3.2.7 起每次加载时重新评估3.2.7NativeLibrary.javajna.tmpdir覆盖临时解包目录默认 macOS 为~/Library/Application Support/JNA/temp其他 Unix 为$XDG_CACHE_DIR/JNA/temp5.0.0 起3.5.0 引入5.0.0 改默认位置Native.javajna.profiler.prefix自动剥离分析器前缀默认$$YJP$$4.0NativeLibrary.javajna.dump_memoryStructure.toString是否输出原生内存转储4.0Structure.java另有 5.0.0 引入的Library.OPTION_CLASSLOADER允许从任意类加载器加载 JNA 原生库、Library.OPTION_STRING_ENCODING每库字符串编码5.14.0 修复其被忽略的 bug、Library.OPTION_OPEN_FLAGS定制dlopen行为3.5.0 引入。八、五个必须知道的重要/破坏性变更CHANGES.md用专门小节标注了升级时可能破坏既有代码的变更以下几项影响面最广8.1 5.0.0一次大规模 API 清理这是破坏性变更最密集的一个版本主要包括Pointer#SIZE移除改用Native#POINTER_SIZE避免多线程初始化 JNA 时的类加载死锁。Pointer#getString(offset, wide)、setString(offset, value, wide)、getStringArray(offset, wide)移除分别以getString/getWideString、setString/setWideString、getStringArray/getWideStringArray替代。Structure#setFieldOrder移除强制使用getFieldOrder()对应 5.0.0 新增的Structure.FieldOrder注解可用注解声明字段顺序而无需实现getFieldOrder()。Native#getDirectByteBuffer由Pointer#getByteBuffer取代Platform#isAix改名为isAIX。Win32 平台SecBufferDesc按正确原生语义重写多 buffer 描述原本是坏的普通场景建议用SspiUtil.ManagedSecBufferDescFILETIME#toLong()改名toTime()COMException结构重构移除pExcepInfo/puArgErr新增hresult成员细节迁至COMInvokeExceptionACE_HEADER取代ACEStructure作为 ACE 基类ACL#getACEStructures更名为getACEs并支持非 ACCESS_ALLOWED/DENIED 类型。LoadTypeLib(WString, ...)、CLSIDFromString(WString, ...)改为 String 版本MonitorFromPoint(Point, ...)改为Point.ByValue。8.2 5.8.0JPMS 构件坐标变更实验性的 JPMSJava 模块系统构件从带jpmsclassifier 改为独立构件 IDjna-jpms.jar与jna-platform-jpms.jar不带 classifier。原因是 platform 构件依赖 jna 构件用 classifier 无法保证解析到正确变体。仓库根目录的 pom-jna-jpms.xml 与 pom-jna-platform-jpms.xml 即对应这两个模块。8.3 5.7.0darwin x86 预构建移除32 位 Java on macOSdarwin x86的预编译原生库被移除这是唯一的Breaking Change。8.4 5.12.0finalizer 退出见第五节改用 Cleaner 后dispose不再保证在子类 finalization 时被调用。8.5 5.14.0varargs 上限与最低 JDKvarargs 调用支持的固定参数上限从 3 提升到255对如printf类函数影响显著同时最低 JDK 升至 8。此外 5.7.0 开始引入的module-info.classjna-jpms.jar在 5.8.0 完成坐标调整。九、platform 模块win32 / unix / mac的持续扩充JNA 的 platform 模块contrib/platform/src/com/sun/jna/platform/为各操作系统提供开箱即用的绑定CHANGES.md中超过一半的条目属于此类。按主题归纳Win32 系统能力注册表RegLoadAppKey、RegNotifyChangeKeyValue、Advapi32Util多语言formatMessage、进程与线程CreateRemoteThread签名修正、GetProcessAffinityMask、Thread32First/Next、IsProcessorFeaturePresent、文件与内存映射OpenFileMapping、VirtualLock/VirtualUnlock、安全isCurrentProcessElevated、Crypt32Util敏感数据清理与零长度数组处理、网络与蓝牙5.19.0 新增WlanApi与BluetoothApis、打印Winspool的SetJob/SetPrinter与打印机通知、电源与电池5.17.0 电源事件、CallNTPowerInformation、性能计数器Pdh/PdhUtil系列。macOSSystemB自 4.2 引入后持续扩展进程/网络/文件系统信息、5.19.0 新增ProcFdInfo/InSockInfo/TcpSockInfo/proc_pidfdinfo/statfs64/vm_deallocate5.19.0 还新增CoreGraphics绑定并实现MacWindowUtils#getAllWindowsXAttr/XAttrUtil的语义与 CLI 对齐5.4.0。Unix/Linuxlibc 封装LibCAPI的size_t/ssize_t、statvfs/sysinfo、libudevUdevDevice#getSysname修复、共享内存LibRT的shm_open/shm_unlink、X11 窗口操作5.15.0 的XMoveWindow等、BSDExtAttr5.14.0、CUPS 打印5.19.0。COM/WMI自 4.x 大规模建设5.14.0 继续补充IWbemClassObject/IWbemServices的方法绑定5.3.0 支持 COM setter 多参数与ProxyObject。一个直观的佐证5.19.0 新增的WlanApi就在仓库中contrib/platform/src/com/sun/jna/platform/win32/WlanApi.java以public interface WlanApi extends Library的标准 JNA 接口形式存在同类的CoreGraphics、Cups、BluetoothApis均可在此目录下找到对应文件。十、给升级者的实战建议先看Important Changes / Breaking Changes小节每次大版本升级前重点排查这些标记段5.0.0 最密集尤其是被移除/改名的 API如Pointer#getString(offset, wide)系列与COMException结构变化。原生库必须匹配只要记录了libjnidispatch需要重建3.3.0、5.14.0自建原生库的团队就必须同步重建即使使用官方 jar也要保证 Java 层与原生层来自同一版本。核对 JDK 基线5.14.0 起需 JDK 8若使用最新发布版5.18.0 起文档化要求 JDK 24请以官方发布说明为准。若需在旧 JDK 上运行应停留在对应历史版本。关注架构匹配os.arch会被归一化如zarch_64→s390x软浮点 ARM 自动归为armel若在 Android 上使用注意 16KB 页大小修复5.16.0/5.17.0与jna.nounpack自动置 true 的机制。善用诊断属性库加载失败时设置jna.debug_loadtrue需要自定义搜索路径时使用jna.library.path临时目录可通过jna.tmpdir覆盖默认已改为各平台的用户缓存目录。对象生命周期5.12.0 起不再依赖 finalizer涉及Memory/CallbackReference/NativeLibrary等资源时请显式调用dispose()/close()不要依赖 GC 兜底。十一、进一步阅读变更日志全文CHANGES.md按版本回溯2.4 至今版本信息定义src/com/sun/jna/Version.java构建系统会替换TEMPLATE占位符平台与架构判定src/com/sun/jna/Platform.java库加载与系统属性src/com/sun/jna/Native.java、src/com/sun/jna/NativeLibrary.java原生库构件清单lib/native各平台*.jar平台模块源码contrib/platform/src/com/sun/jna/platformJPMS 相关 POMpom-jna-jpms.xml、pom-jna-platform-jpms.xml如需获取最新版本可使用git clone该仓库后自行构建构建说明见 README.md 与 common.xml并在升级前反复对照本文梳理的各版本变更点。赞分享系统编程后端【免费下载链接】jnaJava Native Access项目地址https://gitcode.com/gh_mirrors/jn/jna点击查看免费下载相关推荐NNI 版本演进全览从 v0.1 到 v3.0 的变更日志深度解读NNI 版本演进全览从 v0.1 到 v3.0 的变更日志深度解读 本篇文章基于 NNI 官方版本发布日志 release.rst https://link人工智能AutoML机器学习深度学习模型压缩特征工程Apache MXNet 版本演进全览从 v0.5 到 1.8.0 的变更日志深度解读Apache MXNet 版本演进全览从 v0.5 到 1.8.0 的变更日志深度解读 Apache MXNet 的 NEWS.md https://link深度学习人工智能机器学习分布式训练BootstrapVue 变更日志深度解读从 v2.0.0 到 v2.23.1 的版本演进全景BootstrapVue 变更日志深度解读从 v2.0.0 到 v2.23.1 的版本演进全景 本篇技术指南以 BootstrapVue 官方变更日志 do前端UI组件上一篇MTR 开源项目使用教程下一篇如何使用Picturefill实现完美的响应式图片加载方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关推荐

react-vis Highlight 组件实战指南:用拖拽与框选(Brush  Drag)为图表注入交互
react-vis Highlight 组件实战指南:用拖拽与框选(Brush Drag)为图表注入交互

数据可视化图表库前端 【免费下载链接】react-vis Data Visualization Components 项目地址: https://gitcode.com/gh_mirrors/re/react-vis 点击查看 免费下载 说明:react-vis 官方已声明弃用(见 DEPRECATED.md),本文… · 2026/9/25 5:12:28

Xberg Dart API 参考指南:在 Flutter 与纯 Dart 环境中调用 Rust 文档智能引擎
Xberg Dart API 参考指南:在 Flutter 与纯 Dart 环境中调用 Rust 文档智能引擎

后端AI 应用NLP 【免费下载链接】xberg Polyglot document intelligence with a Rust core: extract text, metadata, images, tables, and structured data from 106 formats across 140 file extensions, plus code intelligence for 371 languages. Fifteen bindings, with … · 2026/9/25 5:12:21

BullMQ 官方 .NET 移植版完整指南:基于 Redis 与 PostgreSQL 的跨语言分布式队列
BullMQ 官方 .NET 移植版完整指南:基于 Redis 与 PostgreSQL 的跨语言分布式队列

后端消息队列任务调度 【免费下载链接】bullmq BullMQ - Message Queue and Batch processing for NodeJS, Python, .NET, Elixir, Rust and PHP based on Redis or PostgreSQL 项目地址&#xff1a; https://gitcode.com/gh_mirrors/bu/bullmq 点击查看 免费下载 <output_… · 2026/9/25 5:11:57

WechatDecrypt安全使用指南:解密微信消息后的隐私风险与注意事项
WechatDecrypt安全使用指南:解密微信消息后的隐私风险与注意事项

WechatDecrypt安全使用指南&#xff1a;解密微信消息后的隐私风险与注意事项 【免费下载链接】WechatDecrypt 微信消息解密工具 项目地址: https://gitcode.com/gh_mirrors/we/WechatDecrypt WechatDecrypt 是一款微信消息解密工具&#xff0c;能把 Windows 版微信本地加… · 2026/9/25 5:38:24

lego 集成 Simply.com DNS Provider 签发通配符证书:配置、参数与实现原理详解
lego 集成 Simply.com DNS Provider 签发通配符证书:配置、参数与实现原理详解

网络安全密码学 【免费下载链接】lego Lets Encrypt/ACME client and library written in Go 项目地址&#xff1a; https://gitcode.com/gh_mirrors/le/lego 点击查看 免费下载 本指南以 lego&#xff08;Lets Encrypt/ACME client&#xff0c;Go 语言实现&#xff09;内置的… · 2026/9/25 5:38:24

74LS74四分频电路设计与Multisim仿真全流程
74LS74四分频电路设计与Multisim仿真全流程

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 5:38:18

Origin特殊点标注全攻略:数据点、曲线特征与区域高亮实操
Origin特殊点标注全攻略:数据点、曲线特征与区域高亮实操

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 5:38:11

cube-ui Tip 组件完全指南:气泡提示框的方向控制、偏移定位与交互事件
cube-ui Tip 组件完全指南:气泡提示框的方向控制、偏移定位与交互事件

前端UI组件移动开发 【免费下载链接】cube-ui :large_orange_diamond: A fantastic mobile ui lib implement by Vue 项目地址&#xff1a; https://gitcode.com/gh_mirrors/cu/cube-ui 点击查看 免费下载 导读 Tip 是 cube-ui 提供的一个轻量级气泡提示框组件&#xff0c;用… · 2026/9/25 5:38:11

Atlas 300V 24G推理卡实战:从选型到YOLOv5部署全解析
Atlas 300V 24G推理卡实战:从选型到YOLOv5部署全解析

1. Atlas到底值不值得折腾&#xff1a;产品定位与选型思路1.1 Atlas 300V 24G是什么&#xff0c;为什么这么火最近后台好几个人问我同一个问题&#xff1a;Atlas 300V 24G到底是干什么的&#xff1f;能不能跑YOLO&#xff1f;一开始我以为是某个新手把NVIDIA的卡和昇腾的卡搞混… · 2026/9/25 5:38:05

数值优化(Numerical Optimization)学习系列-03-共轭梯度方法(Conjugate Gradient)
数值优化(Numerical Optimization)学习系列-03-共轭梯度方法(Conjugate Gradient)

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31

创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战
创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31

MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX
MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:37

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码