You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Windows下Rust调用JNI_GetCreatedJavaVMs出现链接错误求助

解决Windows下Rust编译DLL时JNI_GetCreatedJavaVMs未解析的链接错误

问题原因

你遇到的LNK2019错误是因为Rust编译DLL时,没有链接JDK提供的jvm.lib库文件——JNI_GetCreatedJavaVMs是JNI标准函数,定义在该库中,编译器找不到它的实现导致链接失败。

解决方案

方法一:在Rust代码中直接声明并指定链接库

修改你的Rust代码,手动声明JNI函数并添加链接属性,替代直接引用jni::sys中的定义:

use toy_arms::internal;
use jni::sys::JavaVM;

// 手动声明JNI函数并指定链接jvm库
#[link(name = "jvm", kind = "dylib")]
extern "system" {
    fn JNI_GetCreatedJavaVMs(
        vm_buf: *mut *mut JavaVM,
        buf_len: i32,
        n_vms: *mut i32
    ) -> i32;
}

internal::create_entrypoint!(start);

fn start() {
    let mut vms = Vec::new();
    get_created_java_vms(&mut vms);
}

fn get_created_java_vms(vm_buf: &mut Vec<*mut JavaVM>) {
    unsafe {
        // 调用手动声明的函数
        JNI_GetCreatedJavaVMs(vm_buf.as_mut_ptr(), 0, std::ptr::null_mut());
    }
}

方法二:通过Build脚本自动链接库

  1. 在Cargo.toml中添加build依赖:
[build-dependencies]
cc = "1.0"
  1. 在项目根目录创建build.rs文件,内容如下:
fn main() {
    // 读取JAVA_HOME环境变量,确保指向JDK20安装目录
    let java_home = std::env::var("JAVA_HOME")
        .expect("请设置JAVA_HOME环境变量,指向你的JDK20安装路径");
    
    // 指定JVM库的搜索路径(64位系统用amd64,32位用i386)
    let lib_dir = format!("{}/lib/amd64", java_home);
    println!("cargo:rustc-link-search=native={}", lib_dir);
    
    // 链接jvm动态库
    println!("cargo:rustc-link-lib=dylib=jvm");
}
  1. 保持你的原有Rust代码不变,编译时Cargo会自动执行build脚本,完成库的链接。

关键注意事项

  • 位数匹配:确保你的Rust编译目标(32/64位)和JDK的位数完全一致,否则会出现链接或运行时错误。
  • JAVA_HOME验证:确认JAVA_HOME环境变量指向的是JDK20的根目录,而非JRE目录。
  • 库路径检查:JDK的jvm.lib默认位于%JAVA_HOME%\lib\amd64(64位)或%JAVA_HOME%\lib\i386(32位),如果路径不符,需要调整build脚本中的路径。

内容的提问来源于stack exchange,提问作者NightmareXD

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 21:37:28