如何将std::vector<uint8_t>转换为jbyteArray?已有反向转换代码
std::vector<uint8_t> 转 jbyteArray 实现方案
反向转换的核心是借助JNI提供的数组创建与数据写入接口,具体步骤和代码如下:
创建对应长度的jbyteArray
先获取vector的元素数量,调用JNIEnv的NewByteArray方法生成一个长度匹配的字节数组。复制vector数据到jbyteArray
std::vector<uint8_t>的底层存储是连续内存块,可直接通过data()方法获取数据指针,再用JNI的SetByteArrayRegion方法将数据批量写入jbyteArray。这里uint8_t和jbyte本质都是8位字节类型,直接通过reinterpret_cast转换指针后复制数据是安全的,不会改变二进制内容。
完整实现代码:
jbyteArray vectorToJByteArray(JNIEnv* env, const std::vector<uint8_t>& vec) { // 创建对应长度的jbyteArray jbyteArray byteArray = env->NewByteArray(vec.size()); if (byteArray == nullptr) { // 内存分配失败,可根据业务需求添加错误处理逻辑 return nullptr; } // 将vector中的数据复制到jbyteArray env->SetByteArrayRegion(byteArray, 0, vec.size(), reinterpret_cast<const jbyte*>(vec.data())); return byteArray; }
额外优化提示
你之前实现的jbyteArray转vector代码可以简化,无需手动new jbyte管理内存,直接利用JNI的数组元素获取接口更安全高效:
jbyte* elements = env->GetByteArrayElements(byteArray, nullptr); std::vector<uint8_t> retVector(elements, elements + env->GetArrayLength(byteArray)); env->ReleaseByteArrayElements(byteArray, elements, JNI_ABORT); // 无需回写数据,用JNI_ABORT标记
内容的提问来源于stack exchange,提问作者Tim Minear
相关产品推荐
相关产品推荐

