解决Rust函数通过Java JNI调用时的UnsatisfiedLinkError错误
解决Java调用Rust函数的UnsatisfiedLinkError问题
问题根源
Java JNI对Native函数的命名规则和参数列表有严格要求,你的代码不符合这些规范:
- 非静态Native方法的函数名必须遵循
Java_<包名>_<类名>_<方法名>格式(无包名时为Java_RustTest_get_name) - 非静态Native方法必须接收两个默认参数:
JNIEnv*(JNI环境指针)和jobject(当前类实例),即使方法本身没有业务参数
修正后的代码
1. Rust代码
use jni::JNIEnv; use jni::objects::JObject; #[no_mangle] pub extern "C" fn Java_RustTest_get_name(_env: JNIEnv, _obj: JObject) { println!("subham shaw"); }
2. Java代码(确认dll路径正确即可)
public class RustTest { static { // 加载Rust动态库,路径需指向实际生成的dll文件 System.load("E:/Rust_pro/android_test/target/debug/sample.dll"); } public native void get_name(); public static void main(String[] args) { RustTest example = new RustTest(); example.get_name(); } }
3. Cargo.toml(无需修改)
[package] name = "android_test" version = "0.1.0" edition = "2021" [dependencies] jni = "0.21.1" [lib] name = "sample" crate-type = ["cdylib"]
编译与运行步骤
- 编译Rust库:在Rust项目根目录执行
cargo build,确认target/debug/sample.dll生成成功 - 编译Java类:在Java代码所在目录执行
javac RustTest.java - 运行程序:执行
java RustTest
额外注意事项
- 确保Java和Rust编译产物的架构一致(均为32位或均为64位),否则会加载失败。可通过
cargo build --target x86_64-pc-windows-gnu(64位)或i686-pc-windows-gnu(32位)指定架构 - 若不想写绝对路径,可将dll所在目录添加到系统
PATH环境变量,改用System.loadLibrary("sample")加载库
内容的提问来源于stack exchange,提问作者subham009
相关产品推荐
相关产品推荐

