如何在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的
jnicrate方法签名和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
相关产品推荐
相关产品推荐

