JNI 与 JVMCI 后端
选择后端
现有 Profile 和配置继续默认使用 JNI,将原生库打包到所选发布目标的产物中。JVMCI 将编译代码安装进受支持的 HotSpot 运行时,每次构建生成一个特定目标的 JAR。选择 JVMCI 不意味着产物可以在任意 Java 发行版或版本上运行。
后端选择器为每个后端保留独立编辑草稿。报价前请检查可用模块及配置调整。构建记录实际生效的后端、目标和配置,因此历史详情描述的是实际执行的编译。
JVMCI 目标与运行时
JVMCI 每次构建支持一个明确目标:windows-x86_64 或 linux-x86_64。Linux 编译服务可生成其中任一目标;交叉编译不会将二者合成通用 JAR。JNI 保留多目标工作流。
受支持的 JVMCI 运行时为 Azul Zulu 22.0.2+9、x86-64、G1,并需指定相应运行参数。下载产物后,从构建详情复制目标平台启动命令。请保留参数并使用指定运行时,不要直接替换为系统路径上的 Java。产物安装代码时会验证运行时配置。
Linux JVMCI 产物还需要系统 OpenSSL 的 libcrypto 库来执行原生产物绑定,即使可选保护功能关闭也需要该库。编译器发布包中的 jvmci-package-verification.json 记录了随包提供的 Linux 桥接库实际依赖的共享库名称。请在应用运行主机安装匹配的运行库;JDK 本身不提供这些库。
本地 CLI 构建可选择 --backend jvmci --compile-for windows-x86_64 --lto off,Linux 产物使用 linux-x86_64。省略目标时保留 CLI 的宿主默认行为。使用对应目标输出的启动命令,并在分发前于目标系统测试实际生成的 JAR。
模块与预设
JVMCI 有对应的五档构建预设。LTO 支持 off、Thin 和 Full;IR 优化必需,动态注册内置。JVMCI 的 LTO 在每个方法 recipe 的完整原生链接单元内执行,保留 JVM 调用边界,不跨 recipe 内联 Java 方法。JNI 专属的 Unsafe、VMBridge、静态直接调用和虚拟内联缓存设置不适用。模块目录会解释所选后端和目标的支持情况及依赖,不能简单地将 JNI 预设改名为 JVMCI。
运行时保护也与目标有关。Windows 上可用的功能并不自动适用于 Linux。不支持的组合会在编译前报告;切换目标不会静默提供等价保护。
Semantic Mirage 是 JVMCI 的实验选项。Runtime Profile 是需主动开启的诊断功能,会增加计数开销;普通生产构建若不需要计数,应保持关闭。Structural Obfuscation 提供 application 模式和实验性的 whole-artifact 模式。私有映射文件可随构建产物下载,应与对应发布版本一起保留。
配置与计费
网页 YAML 导入导出包含后端、目标和模块配置,采用 Web 预设格式,不接受任意 CLI JSON。未指定后端的现有配置继续使用 JNI。
JVMCI 构建沿用现有 NCU 计算,以实际所选方法、单目标、所选 LTO 模式和启用功能计算。独立的 NOL 配置分析免费,不冻结或消耗 NCU。编译成功不是性能保证;请测试应用行为,并测量实际关心的工作负载。