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) }
问题与修复
存在两个核心问题:
jbyteArray是原始指针别名,convert_byte_array不需要接收引用,直接传值即可;若参数必须保留引用,需解引用后传递。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
相关产品推荐
相关产品推荐

