通过binder传递结构体数组信息

1.首先binder是用来进程之间通信使用的,我要从一个进程将将一个结构体数组传递给另一个进程,封装api,从一个接口调用---client端----service端-----另一个进程使用

2、进程a调用接口传递一个结构体数组

typedef struct {
    int left; int top;
    int width; int height;
} ipc_video_area_t;

       

        int i = 0;
        ipc_video_area_t video_area[2] = {{758,25,266,205},{9,25,740,555}};
        xVector video_vector = {0};
        x_vector_init(&video_vector, 2, sizeof(ipc_video_area_t));
        for(i = 0; i< 2; i++){
          x_vector_set(&video_vector, i, (void *)&video_area[i]);
        }
        binder_set_video_display_area_new(call_info->chan, video_vector);
        x_vector_free(&video_vector);

(1)接口 binder_set_video_display_area_new   传递结构体为 video_area

(2)先定义一个binder传递过程中的数组块video_vector(这好像是c++的,暂时叫数组块吧)

   给它init空间,并循环填充到数组块里,然后给接口做参数,传入

2、client端处理并传递给service

void binder_set_video_display_area_new(int chan, xVector video_vector)
{
    sp<ICallService> service = get_call_service();
    if (service == NULL) return;

    int32_t i = 0;
    vector<CommonParcelable> cpp_vector;

    for (int i = 0; i < video_vector.size; i++){
        cpp_vector.push_back(CommonParcelable((const char *)x_vector_get(&video_vector, i), sizeof(ipc_video_area_t)));
    }
    service->setVideoLocalAreaNew(chan, cpp_vector);
}

(1)vector<CommonParcelable> 要创建一个这个类型的cpp_vector,应为传递给service 需要包上一层CommonParcelable(我也不知道为啥)

(2)然后把传过来的 video_vector 通过push_back填充到cpp_vector,这时候就把它做参数传递给service端

3、service端处理,并传递给另一个进程

virtual binder::Status setVideoLocalAreaNew(int32_t chan, const ::std::vector<com::fv::CommonParcelable>& video_vector) {

    int32_t i = 0;
    xVector cpp_vector = {0};
    x_vector_init(&cpp_vector, 2, sizeof(ipc_video_area_t));
    for (vector<CommonParcelable>::const_iterator iter = video_vector.begin(); iter != video_vector.end(); iter++) {
      if (iter->getLength() == sizeof(ipc_video_area_t)) {
          x_vector_set(&cpp_vector, i, (void *)iter->getData());
          i++;
      }
    }
    pfm_video_set_display_area_new(chan, cpp_vector);

    x_vector_free(&cpp_vector);
    return binder::Status::ok();
}*

(1)传递过来的值上加了const (注意,和不加的是两种不同的转换方式),又定义一次cpp_vector,将传过来的数组在通过x_vector_set设置到cpp_vector中,做参数传递给另一个进程的函数pfm_video_set_display_area_new做参数,不要忘记释放掉cpp_vector

(2)service端定义在aidl文件中

4、b进程函数使用这个结构体数组

ipc_video_area_t g_area_video[4] = {0};
void pfm_video_set_display_area_new(int chan, xVector vector) {
     static int change_video_area = 0;

     if(change_video_area == 0){
         int i;
         for(i = 0; i< 2; i++){
             memcpy(&g_area_video[i], (ipc_video_area_t*)x_vector_get(&vector, i), sizeof(ipc_video_area_t));
         }
         setVideoSurface(chan, &g_area_video[0], &g_area_video[1]);
         change_video_area = 1;
         printf("new_remote_area(%d %d %d %d %d)\n",g_area_video[1].area_x,g_area_video[1].area_y,g_area_video[1].area_w,g_area_video[1].area_h ,chan);
         printf("new_local_area(%d %d %d %d %d)\n",g_area_video[0].area_x,g_area_video[0].area_y,g_area_video[0].area_w,g_area_video[0].area_h ,chan);
     }else if(change_video_area == 1){
         int j;
         for(j = 2; j < 4; j++){
             memcpy(&g_area_video[j], (ipc_video_area_t*)x_vector_get(&vector, j-2), sizeof(ipc_video_area_t));
         }
         setVideoSurface(chan, &g_area_video[2], &g_area_video[3]);
         change_video_area = 0;
         printf("new_remote_area(%d %d %d %d %d)\n",g_area_video[3].area_x,g_area_video[3].area_y,g_area_video[3].area_w,g_area_video[3].area_h ,chan);
         printf("new_local_area(%d %d %d %d %d)\n",g_area_video[2].area_x,g_area_video[2].area_y,g_area_video[2].area_w,g_area_video[2].area_h ,chan);
     }
}

(1)进程使用,定义一开始我们传递的结构体类型g_area_video,然后循环从传过来的数组块空间拷贝给结构体数组

     for(i = 0; i< 2; i++){
             memcpy(&g_area_video[i], (ipc_video_area_t*)x_vector_get(&vector, i), sizeof(ipc_video_area_t));
         }

然后就可以使用这个数组中的数据了(将指针空间赋值给数组地址用memcpy)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值