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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 01:13:11