簡體   English   中英

反序列化Java中通過JNI從C ++傳遞的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空”字符串。

所以,是的……有人可以告訴我,反序列化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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM