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

如何在Rust中通过JNI向Java静态方法传递参数?

Rust调用Java main方法传递字符串数组的解决方案

实现步骤

  • 获取java/lang/String类的引用,作为数组元素的类型
  • 创建对应长度的Java字符串数组对象
  • 将每个Rust字符串转换为Java String对象,逐个填充到数组中
  • 将数组作为参数传入call_static_method调用Java的main方法

完整代码示例

use jni::objects::{JClass, JObjectArray, JObject, JString};
use jni::JNIEnv;

// 假设你已经成功获取了JNI环境和目标类实例
// let env: JNIEnv = ...;
// let class: JClass = ...;

// 定义需要传递的参数列表
let args = [
    "--username",
    "Test",
    "--version",
    "1.7.10",
    "--uuid",
    "4f19c3577b774731bcc663e536ebd108",
    "--accessToken",
    "12412412412",
    "--userProperties",
    "{}",
];

// 1. 获取Java String类
let string_class = env.find_class("java/lang/String")
    .expect("无法找到java/lang/String类");

// 2. 创建空的字符串数组,初始元素为null
let str_array: JObjectArray = env.new_object_array(
    args.len() as i32,
    string_class,
    JObject::null()
).expect("创建字符串数组失败");

// 3. 遍历填充数组元素
for (index, arg) in args.iter().enumerate() {
    // 将Rust字符串转为Java String对象
    let java_str: JString = env.new_string(arg)
        .expect(&format!("转换字符串\"{}\"失败", arg));
    
    // 设置数组对应位置的元素
    env.set_object_array_element(&str_array, index as i32, &java_str)
        .expect(&format!("设置数组第{}个元素失败", index));
}

// 4. 调用Java的main静态方法
env.call_static_method(
    class,
    "main",
    "([Ljava/lang/String;)V",
    &[str_array.into()]
).expect("调用main方法失败");

关键说明

  • Rust的jni crate方法签名和C++ JNI略有差异:比如new_object_array的参数顺序更直观,不需要手动传递JNIEnv指针
  • 使用new_string方法可以直接将Rust的&str转为Java String,无需手动处理字符串长度
  • call_static_method的最后一个参数是&[JValue]类型,通过into()可以将JObjectArray自动转换为JValue
  • 实际项目中建议用Result类型替代expect做错误处理,避免程序panic

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 08:20:34