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

Rust JNI调用报错:类型不匹配及序列化反序列化问题求助

JNI调用Rust序列化/反序列化错误修复

序列化错误

报错信息

expected *mut jni::sys::_jobject, found struct jni::objects::JPrimitiveArray

原代码

fn serialize_response<T: Message>(
    env: &JNIEnv,
    value: T,
) -> Result<jbyteArray, ClientJniError> {
    let serialized = value.write_to_bytes()?;
    Ok(env.byte_array_from_slice(serialized.as_slice())?)
}

问题与修复

函数声明返回jbyteArray(本质是*mut jni::sys::_jobject的别名),但env.byte_array_from_slice返回的是JPrimitiveArray<'_, i8>类型,两者类型不匹配。

只需调用JPrimitiveArray的as_raw方法获取原始指针,转换为jbyteArray即可:

fn serialize_response<T: Message>(
    env: &JNIEnv,
    value: T,
) -> Result<jbyteArray, ClientJniError> {
    let serialized = value.write_to_bytes()?;
    let j_array = env.byte_array_from_slice(serialized.as_slice())?;
    Ok(j_array.as_raw() as jbyteArray)
}

反序列化错误

报错信息

Message::parse_from_bytes(&*env.convert_byte_array(buffer)?.as_slice())?;
                                ------------------ ^^^^^^ the trait `std::convert::AsRef<jni::objects::JPrimitiveArray<'_, i8>>` is not implemented for `*mut jni::sys::_jobject`
                                |
                                required by a bound introduced by this call

原代码

fn deserialize_from_jni<T: Message>(env: &JNIEnv, buffer: &jbyteArray) -> Result<T, ClientJniError> {
    let buffer_deserialized =
        Message::parse_from_bytes(&*env.convert_byte_array(buffer)?.as_slice())?;
    Ok(buffer_deserialized)
}

问题与修复

存在两个核心问题:

  1. jbyteArray是原始指针别名,convert_byte_array不需要接收引用,直接传值即可;若参数必须保留引用,需解引用后传递。
  2. convert_byte_array返回Vec<u8>,直接调用as_slice()就能得到&[u8],无需&*的冗余操作。

修复方案1(修改参数为值传递):

fn deserialize_from_jni<T: Message>(env: &JNIEnv, buffer: jbyteArray) -> Result<T, ClientJniError> {
    let byte_slice = env.convert_byte_array(buffer)?.as_slice();
    let buffer_deserialized = Message::parse_from_bytes(byte_slice)?;
    Ok(buffer_deserialized)
}

修复方案2(保留参数引用):

fn deserialize_from_jni<T: Message>(env: &JNIEnv, buffer: &jbyteArray) -> Result<T, ClientJniError> {
    let byte_slice = env.convert_byte_array(*buffer)?.as_slice();
    let buffer_deserialized = Message::parse_from_bytes(byte_slice)?;
    Ok(buffer_deserialized)
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 23:30:28