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脚本自动链接库
- 在
Cargo.toml中添加build依赖:
[build-dependencies] cc = "1.0"
- 在项目根目录创建
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"); }
- 保持你的原有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
相关产品推荐
相关产品推荐

