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;}



binder_server.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"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