在Java中反序列化从c++通过JNI传递的protobuf ByteArray
Deserializing a protobuf ByteArray in Java that was passed from C++ over JNI
我有一个protobuffer消息,其字段填充了数据。我在c++中首先将此消息序列化为char*,然后将该char*的内容复制到jbyteArray。然后我将jbyteArray返回给我的java类,我想在其中对它进行反序列化,这样我就可以访问消息/类的各个字段。但我真的不知道怎么做。
这是我到目前为止的代码:
public String IMEI(){
GetDeviceInfo nativeDeviceInfo = new GetDeviceInfo();
byte[] ret = nativeDeviceInfo.getDeviceData();
CellPhoneDevice.Builder device = CellPhoneDevice.newBuilder();
try {
device.mergeFrom(ret);
} catch (InvalidProtocolBufferException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(!device.hasImeiNumber())
return "imei empty";
long imei = device.getImeiNumber();
String str = String.valueOf(imei);
// String str = new String(ret); //see if ByteArray is even filled
return str;
}
我已经检查了byteArray是否包含数据(见注释行),它是填充的,所以我猜我在解析byteArray时做错了什么。我搜索了很多网站/教程,但没有太多关于反序列化byteArrays,如果有,我无法复制它(方法未定义等东西)。
当我运行这段代码时,它执行没有任何错误,但是应该包含imei的字符串只包含"0",并且该方法返回"imei empty"字符串。
所以,是的…谁能告诉我,反序列化byteArray的方法是什么?
如果您在本机代码中加载Java数组并且在Java端没有获得数据(0),请检查以确保您正在调用Release-TYPE-ArrayElements()。下面是一个示例代码片段:
if ((function & FUNCTION_04) > 0 ) {
arrayB = (jbyteArray) (*env)->GetObjectField(env, jObjectOut, fidB);
pArrayB = (*env)->GetByteArrayElements(env, arrayB, 0);
arrayBsize = (*env)->GetArrayLength(env, arrayB);
for (x = 0; x < arrayBsize; x++) {
pArrayB[x] = x;
}
(*env)->ReleaseByteArrayElements(env, arrayB, pArrayB, 0);
}
阅读:http://docs.oracle.com/javase/1.5.0/docs/guide/jni/spec/functions.html
相关文章:
- 带有Protobuf序列化的C++Hazelcast:字符串不是UTF-8格式的
- Google protobuf 时间戳未声明标识符,在 Windows 上具有C++
- 如何继承 Protobuf 生成的C++类
- FlatBuffers/Protobuf 中是否有支持任意 24 位有符号整数定义的可移植二进制序列化架构?
- gRPC 找不到 Protobuf 库
- protobuf C++ SQLite handle blob data
- Protobuf ShortDebugString() crash
- Protobuf中重复字段的问题.使用重复字段进行序列化/反序列化的更好方法是什么?
- CMake 在编译 Google 的 protobuf 示例时找不到 protobuf
- C++ protobuf SerializedData
- 从 Any 包中提取和匹配 protobuf 消息类型名的首选方法
- protobuf 的 ParseFromString 函数返回 false
- C++:如何通过 curl 调用使用 HTTP post 请求发送二进制数据(protobuf 数据)
- 防止 GNU Make 在每次构建时生成 protobuf 代码
- 如何在C++中分配嵌套的protobuf而不进行复制
- E/libc++abi:终止于类型为google::protobuf::FatalException的未捕获异常
- 修改原始protobuf流
- protobuf,如何在protobuf消息中遍历所有集合字段,我不知道详细信息?(C++)
- Protobuf中的ParseFromArray和ParseFromString之间有什么区别
- 在Java中反序列化从c++通过JNI传递的protobuf ByteArray