[英]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空”字符串。
所以,是的……有人可以告訴我,反序列化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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.