我需要将数据填充到SetByteArrayRegion:
void JNIEnv::SetByteArrayRegion(jbyteArray array, jsize start, jsize len, const jbyte *buf)
其中jbyte
就是int8_t
。我的向量为uint8_t
。为什么我不能将其转换为int8_t
的向量? uint8_t
和int8_t
的大小相同,因此可以轻松投射。
std::vector<uint8_t> messageResponseVector_ = //...
std::vector<int8_t> messageResponseVector = static_cast<std::vector<int8_t>>(messageResponseVector_);//does not work
在这种情况下最好做什么?我收到的向量为std::vector<uint8_t>
。我可以通过for循环轻松转换为std::vector<int8_t>
,但是有没有更简单的方法?
答案 0 :(得分:1)
#include <vector>
#include <algorithm>
int foo() {
std::vector<uint8_t> messageResponseVector_;
std::vector<int8_t> messageResponseVector2(messageResponseVector_.begin(), messageResponseVector_.end());
}
答案 1 :(得分:1)
您不能将vector<uint8_t>
强制转换为vector<int8_t>
,它们是完全独立且无关的类型。但是,您可以改为投射 data ,例如:
std::vector<uint8_t> messageResponseVector_ = //...
jbyte *data = reinterpret_cast<jbyte*>(messageResponseVector_.data());
env->SetByteArrayRegion(array, 0, messageResponseVector_.size(), data);
但是,由于严格的别名规则,从技术上来说,这是未定义的行为。 更安全选项是简单地将数据复制到单独的vector<jbyte>
中,例如:
std::vector<uint8_t> messageResponseVector_ = //...
std::vector<jbyte> messageResponseVector2_(messageResponseVector_.begin(), messageResponseVector_.end());
jbyte *data = messageResponseVector2_.data();
env->SetByteArrayRegion(array, 0, messageResponseVector2_.size(), data);
否则,请查看是否可以更改代码以将messageResponseVector_
接收为vector<int8_t>
(如果不是vector<jbyte>
)作为开头,
std::vector<int8_t> messageResponseVector_ = //...
jbyte *data = reinterpret_cast<jbyte*>(messageResponseVector_.data());
env->SetByteArrayRegion(array, 0, messageResponseVector2_.size(), data);