binder第二课
来源:互联网 发布:java android api 编辑:程序博客网 时间:2024/06/06 01:32
binder demo测试:
test_client.c
/* Copyright 2008 The Android Open Source Project */#include <stdio.h>#include <stdlib.h>#include <errno.h>#include <linux/types.h>#include<stdbool.h>#include <string.h>#include <private/android_filesystem_config.h>#include "binder.h"#include "test_server.h"uint32_t svcmgr_lookup(struct binder_state *bs, uint32_t target, const char *name){ uint32_t handle; unsigned iodata[512/4]; struct binder_io msg, reply; bio_init(&msg, iodata, sizeof(iodata), 4); bio_put_uint32(&msg, 0); // strict mode header bio_put_string16_x(&msg, SVC_MGR_NAME); bio_put_string16_x(&msg, name); if (binder_call(bs, &msg, &reply, target, SVC_MGR_CHECK_SERVICE)) return 0; handle = bio_get_ref(&reply); if (handle) binder_acquire(bs, handle); binder_done(bs, &msg, &reply); return handle;}struct binder_state *g_bs;uint32_t g_handle;void sayhello(void){ unsigned iodata[512/4]; struct binder_io msg, reply;/* 构造binder_io */ bio_init(&msg, iodata, sizeof(iodata), 4); bio_put_uint32(&msg, 0); // strict mode header/* 放入参数 *//* 调用binder_call */ if (binder_call(g_bs, &msg, &reply, g_handle, HELLO_SVR_CMD_SAYHELLO))//g_handle:通过svcmgr_lookup查询到的server的handle return ;/* 从reply中解析出返回值 *///这里不需要解析返回值 binder_done(g_bs, &msg, &reply);//表明已经处理完成}int sayhello_to(char *name){unsigned iodata[512/4];struct binder_io msg, reply;int ret;/* 构造binder_io */bio_init(&msg, iodata, sizeof(iodata), 4);bio_put_uint32(&msg, 0); // strict mode header/* 放入参数 */ bio_put_string16_x(&msg, name);//把字符串放入buf中/* 调用binder_call */if (binder_call(g_bs, &msg, &reply, g_handle, HELLO_SVR_CMD_SAYHELLO_TO))return 0;/* 从reply中解析出返回值 */ret = bio_get_uint32(&reply);binder_done(g_bs, &msg, &reply);return ret;}/* ./test_client hello * ./test_client hello <name> */int main(int argc, char **argv){ int fd; struct binder_state *bs; uint32_t svcmgr = BINDER_SERVICE_MANAGER; uint32_t handle;int ret;if (argc < 2){ fprintf(stderr, "Usage:\n"); fprintf(stderr, "%s hello\n", argv[0]); fprintf(stderr, "%s hello <name>\n", argv[0]); return -1;} bs = binder_open(128*1024); if (!bs) { fprintf(stderr, "failed to open binder driver\n"); return -1; }g_bs = bs;/* get service */handle = svcmgr_lookup(bs, svcmgr, "hello");if (!handle) { fprintf(stderr, "failed to get hello service\n"); return -1;}g_handle = handle;/* send data to server */if (argc == 2) {sayhello();} else if (argc == 3) {ret = sayhello_to(argv[2]); fprintf(stderr, "get ret of sayhello_to = %d\n", ret);}binder_release(bs, handle); return 0;}
/* Copyright 2008 The Android Open Source Project */#include <stdio.h>#include <stdlib.h>#include <errno.h>#include <linux/types.h>#include<stdbool.h>#include <string.h>#include <private/android_filesystem_config.h>#include "binder.h"#include "test_server.h"int svcmgr_publish(struct binder_state *bs, uint32_t target, const char *name, void *ptr){ int status; unsigned iodata[512/4]; struct binder_io msg, reply; bio_init(&msg, iodata, sizeof(iodata), 4); bio_put_uint32(&msg, 0); // strict mode header bio_put_string16_x(&msg, SVC_MGR_NAME); bio_put_string16_x(&msg, name); bio_put_obj(&msg, ptr); if (binder_call(bs, &msg, &reply, target, SVC_MGR_ADD_SERVICE)) return -1; status = bio_get_uint32(&reply); binder_done(bs, &msg, &reply); return status;}void sayhello(void){static int cnt = 0;fprintf(stderr, "say hello : %d\n", cnt++);}int sayhello_to(char *name){static int cnt = 0;fprintf(stderr, "say hello to %s : %d\n", name, cnt++);return cnt;}int hello_service_handler(struct binder_state *bs, struct binder_transaction_data *txn, struct binder_io *msg, struct binder_io *reply){/* 根据txn->code知道要调用哪一个函数 * 如果需要参数, 可以从msg取出 * 如果要返回结果, 可以把结果放入reply *//* sayhello * sayhello_to */ uint16_t *s;char name[512]; size_t len; uint32_t handle; uint32_t strict_policy;int i; // Equivalent to Parcel::enforceInterface(), reading the RPC // header with the strict mode policy mask and the interface name. // Note that we ignore the strict_policy and don't propagate it // further (since we do no outbound RPCs anyway). strict_policy = bio_get_uint32(msg); switch(txn->code) { case HELLO_SVR_CMD_SAYHELLO:sayhello(); return 0; case HELLO_SVR_CMD_SAYHELLO_TO:/* 从msg里取出字符串 */s = bio_get_string16(msg, &len);if (s == NULL) {return -1;}for (i = 0; i < len; i++)name[i] = s[i];name[i] = '\0';/* 处理 */i = sayhello_to(name);/* 把结果放入reply */bio_put_uint32(reply, i); break; default: fprintf(stderr, "unknown code %d\n", txn->code); return -1; } return 0;}int main(int argc, char **argv){ int fd; struct binder_state *bs; uint32_t svcmgr = BINDER_SERVICE_MANAGER; uint32_t handle;int ret; bs = binder_open(128*1024); if (!bs) { fprintf(stderr, "failed to open binder driver\n"); return -1; }/* add service */ret = svcmgr_publish(bs, svcmgr, "hello", (void *)123); if (ret) { fprintf(stderr, "failed to publish hello service\n"); return -1; }ret = svcmgr_publish(bs, svcmgr, "goodbye", (void *)124); if (ret) { fprintf(stderr, "failed to publish goodbye service\n"); }#if 0while (1){/* read data *//* parse data, and process *//* reply */}#endif binder_loop(bs, hello_service_handler); return 0;}
0 0
- binder第二课
- binder第一课
- binder
- binder
- binder
- Binder
- binder
- binder
- Binder
- binder
- binder
- Binder
- Binder
- Binder
- binder
- Binder
- Binder
- Binder
- ImageFont Module
- iOS离屏绘制的性能和机制分析
- 编写将一个包含有20个数据的数组M分成两个数组,正整数数组P和负数数组N ,分别把这两个数组中的数据的个数显示出来
- CSS3学习笔记(二)2015-12-9【从新浪云搬运】
- 最火爆的开源流式系统Storm vs 新星Samza
- binder第二课
- HDU 5654 xiaoxin and his watermelon candy
- 关于大型网站技术演进的思考(十四)--网站静态化处理—前后端分离—上(6)
- 挖掘DBLP作者合作关系,FP-Growth算法实践(5):挖掘研究者合作关系
- 文档词频分析小工具
- 关于大型网站技术演进的思考(十三)--网站静态化处理—CSI(5)
- UVa 340 - Master-Mind Hints
- 笔试练习二
- 有关Mac版本AS类里面无法编写代码的问题