android binder


android native(C++)层的service 一般都会用到binder,通过binder的机制对外提供接口,如果我们需要实现一个native 层的service,那么要怎么做呢?

这个基本上是一个固定的套路,所以我们需要先了解一下android 提供的binder (框架?)的关系。XXXService就是要基于binder通信的类。



    例如要实现一个TestService

    1、ITestService.h 

      

#ifndef ANDROID_HXIONG_ITEST_H
#define ANDROID_HXIONG_ITEST_H

#include <stdint.h>
#include <sys/types.h>
#include <utils/Errors.h>
#include <utils/RefBase.h>

#include <binder/IInterface.h>

namespace android {

class ITestService : public IInterface
{
public:
    DECLARE_META_INTERFACE(ITestService);
    virtual status_t test(int api) = 0;
};

// ----------------------------------------------------------------------------

class BnTestService : public BnInterface<ITestService>
{
public:
    virtual status_t    onTransact( uint32_t code,
                                    const Parcel& data,
                                    Parcel* reply,
                                    uint32_t flags = 0);
};

// ----------------------------------------------------------------------------
}; // namespace android

#endif 

     2、ITestService.cpp

#include <binder/Parcel.h>
#include <binder/IInterface.h>
#include <ITestService.h>

namespace android {
// ----------------------------------------------------------------------------

enum {
    TEST = IBinder::FIRST_CALL_TRANSACTION,
}

class BpTestService : public BpInterface<ITestService>
{

    BpTestService()
    {
    }
    virtual ~BpTestService();
    
    virtual status_t test(int api) {
        Parcel data, reply;
        data.writeInterfaceToken(ITestService::getInterfaceDescriptor());
        data.writeInt32(api);
        remote()->transact(TEST, data, &reply);
        result = reply.readInt32();
        return result;
    }
};
IMPLEMENT_META_INTERFACE(TestService, "com.hxiong.ITestService");

status_t BnTestService::onTransact(
    uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
{
    switch(code) {
        case TEST: {
            CHECK_INTERFACE(ITestService, data, reply);
            int api = data.readInt32();
            int result=test(api);    //这里会调用到TestService 的test函数
            reply->writeInt32(result);
            return NO_ERROR;
        }
    }
    return BBinder::onTransact(code, data, reply, flags);
}

     3、TestService.h

#ifndef ANDROID_HXIONFG_TEST_H
#define ANDROID_HXIONFG_TEST_H

#include <ITestService.h>

namespace android {


class TestService : public BnTestService{
public:
  
    TestService();
    virtual ~TestService();
  
     virtual status_t test(int api);
};
}
#endif

4、TestService.cpp

#include <TestService.h>

namespace android {

	TestService::TestService(){}

	TestService::~TestService() {}

	status_t TestService::test(int api){
	   return 0;
	}

}


    



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
千里马8年Android系统及应用开发经验,曾担任过美国unokiwi公司移动端技术总监兼架构师,对系统开发,性能优化,应用高级开发有深入的研究,Android开源定制ROM Lineage的贡献者之一,国内首家线下开辟培训Android Framework课程,拥有2年的Android系统培训经验。成为腾讯课堂专业负责android framework课程分享第一人,致力于提高国内android Framework水平Android Framework领域内是国内各大手机终端科技公司需要的人才,应用开发者都对Android系统充满着好奇,其中的binder是重中之重,都说无binderAndroidbinde是Android系统的任督二脉。课程水平循序渐进,由中级再到高级,满足各个层次水平的android开发者。1、灵活使用binder跨进程通信,在app端对它的任何api方法等使用自如2、可以单独分析android系统源码中任何binder部分,分析再也没有难度3、掌握binder驱动本质原理,及对应binder驱动怎么进行跨进程通信,及内存等拷贝方式数据等4、对binder从上层的java app端一直到最底层的内核binder驱动,都可以顺利理通5、针对系统开发过程中遇到的binder报错等分析方法,及binder bug案例学习6、针对面试官任何的binder问题都可以对答自如7、socket这种跨进程通信实战使用8、针对android源码中使用的socket源码轻松掌握9、android系统源码中最常见的socketpair中双向跨进程通信10、使用socket实现一个可以让app执行shell命令的程序

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值