安卓原生包裹使用情况

Android native Parcel usage

本文关键字:用情 情况 包裹 原生      更新时间:2023-10-16

我正在尝试使用本机代码的包裹:

#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: %dn", t);
  else if(t == BAD_VALUE)
    printf("Bad Valuen");
  int32_t jj = 0;
  t = data.readInt32(&jj);
  printf("t: %dn", t);
  printf("ParcelTest: %dn", jj);
  return 0;
}

要编译此代码,需要Android的源代码树。将其放在外部/包裹测试下。Android.mk 就在这里。运行mmma external/ParcelTest进行编译。

程序的输出为:

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

Status: 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: %dn", t);
  else if(t == BAD_VALUE)
    printf("Bad Valuen");
  int32_t jj = 0;
  data.setDataPosition(0);
  t = data.readInt32(&jj);
  printf("t: %dn", t);
  printf("ParcelTest: %dn", jj);
  return 0;
}

读取位置必须手动设置。

相关文章: