Android Kotlin List<String>通过JNI转Rust Vec<String>实现疑问
JNI实现Kotlin List转Rust Vec
问题1:是否需要自定义转换函数?
是的,不存在Java/Kotlin List<String>到Rust Vec<String>的直接自动转换。因为JNI层面仅提供基础的Java对象操作接口,Rust的jni crate也只封装了JNI的基础类型(如jobject、jstring),两者内存模型和数据结构完全不同,必须手动实现转换逻辑。
问题2:转换函数实现细节
以下是完整的实现代码,数据量小的场景下直接拷贝即可,不会破坏Kotlin侧原数据:
Kotlin侧代码
class RustBridge { // 声明native函数,接收List<String>参数 external fun processStringList(inputList: List<String>): String companion object { init { System.loadLibrary("rust_core") // 加载Rust编译的so库 } } }
Rust侧代码(依赖jni crate)
首先在Cargo.toml中添加依赖:
[dependencies] jni = { version = "0.21.1", features = ["default"] }
然后是转换逻辑和native函数实现:
use jni::objects::{JList, JString, JObject}; use jni::sys::{jobject, jstring}; use jni::JNIEnv; #[no_mangle] pub extern "system" fn Java_com_example_yourpackage_RustBridge_processStringList( mut env: JNIEnv, _this: jobject, input_list: jobject, ) -> jstring { // 将JNI jobject转换为JList包装类 let j_list = JList::from_env(&mut env, input_list).unwrap(); let list_size = j_list.size(&mut env).unwrap(); // 遍历List,转换每个元素为Rust String,收集到Vec中 let mut rust_vec: Vec<String> = Vec::with_capacity(list_size); for i in 0..list_size { let j_str_obj = j_list.get(&mut env, i).unwrap(); let j_str = JString::from(j_str_obj); let rust_str = env.get_string(&j_str).unwrap().into(); rust_vec.push(rust_str); } // 这里可以添加你的Rust核心处理逻辑,比如打印Vec内容 println!("Received from Kotlin: {:?}", rust_vec); // 返回处理结果给Kotlin(示例返回一个字符串) let result_str = env.new_string("Processing completed").unwrap(); result_str.into_raw() }
参数传递说明
env:JNI环境指针,Rust中通常以&mut JNIEnv传递,这是JNI操作的上下文,不会影响Kotlin侧数据。input_list:Kotlin侧List<String>对应的JNI对象,通过JList包装类操作,我们只是读取其中的元素并拷贝,不会修改原List的内容,因此完全不会破坏Kotlin侧的数据。
内容的提问来源于stack exchange,提问作者NumesSanguis
相关产品推荐
相关产品推荐

