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

解决Rust函数通过Java JNI调用时的UnsatisfiedLinkError错误

解决Java调用Rust函数的UnsatisfiedLinkError问题

问题根源

Java JNI对Native函数的命名规则和参数列表有严格要求,你的代码不符合这些规范:

  1. 非静态Native方法的函数名必须遵循Java_<包名>_<类名>_<方法名>格式(无包名时为Java_RustTest_get_name)
  2. 非静态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"]

编译与运行步骤

  1. 编译Rust库:在Rust项目根目录执行cargo build,确认target/debug/sample.dll生成成功
  2. 编译Java类:在Java代码所在目录执行javac RustTest.java
  3. 运行程序:执行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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 03:22:04