我有一个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”-string。
所以,是的...有人可以告诉我,反序列化byteArray的方法是什么?
答案 0 :(得分:0)
如果要在本机代码中加载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