Android原生Parcel用法

时间:2018-04-12 12:17:51

标签: android c++ native parcel

我正在使用本机代码尝试Parcel:

#include <stdio.h>
#include <binder/IInterface.h>
#include <binder/Parcel.h>
#include <binder/IBinder.h>
#include <binder/Binder.h>
#include <binder/ProcessState.h>
#include <binder/IPCThreadState.h>
#include <binder/IServiceManager.h>

using namespace android;

int main()
{
  int32_t i = 123, j = 456;

  Parcel data;
  status_t t = data.writeInt32(j);
  if(t == NO_ERROR)
    printf("Status: %d\n", t);
  else if(t == BAD_VALUE)
    printf("Bad Value\n");

  int32_t jj = 0;
  t = data.readInt32(&jj);
  printf("t: %d\n", t);
  printf("ParcelTest: %d\n", jj);

  return 0;
}

要编译此代码,需要Android的源代码树。把它放在外部/ ParcelTest下。 Android.mk是here。运行mmma external/ParcelTest进行编译。

该计划的输出是:

generic_x86:/ # /system/bin/ParcelTest
Status: 0
t: -61
ParcelTest: 0

Status: 0表示将值写入包中可以解决问题。但阅读没有。因此,如果我按照我写的顺序读取数据,那么Parcel就是这样,我会得到正确的结果。知道为什么这个代码示例失败了吗?

1 个答案:

答案 0 :(得分:0)

正确用法如下:

#include <stdio.h>
#include <binder/IInterface.h>
#include <binder/Parcel.h>
#include <binder/IBinder.h>
#include <binder/Binder.h>
#include <binder/ProcessState.h>
#include <binder/IPCThreadState.h>
#include <binder/IServiceManager.h>

using namespace android;

int main()
{
  int32_t i = 123, j = 456;

  Parcel data;
  status_t t = data.writeInt32(j);
  if(t == NO_ERROR)
    printf("Status: %d\n", t);
  else if(t == BAD_VALUE)
    printf("Bad Value\n");

  int32_t jj = 0;
  data.setDataPosition(0);
  t = data.readInt32(&jj);
  printf("t: %d\n", t);
  printf("ParcelTest: %d\n", jj);

  return 0;
}

必须手动设置读取位置。