在Java中反序列化通过JNI从C ++传递的protobuf ByteArray

时间:2014-05-13 09:40:01

标签: java c++ java-native-interface bytearray protocol-buffers

我有一个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的方法是什么?

1 个答案:

答案 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