如何写一个native层的service

android的service大概有这么几种形式,Java service ,native service,或者Java层通过某种通信方式比如socket和demon交互.
Java层的aidl很方便,写socket的demon方式也很好理解,native的就显得稍微麻烦一点,咱们通过一个例子来说一下,首先说我们不讲解binder的内部机制….
我们打算写个简单的service,只提供set和get方法

  1. 先写一个bin 的可执行文件

    int main(int argc, char** argv)
    {
    signal(SIGPIPE, SIG_IGN);
    sp proc(ProcessState::self());
    sp sm = defaultServiceManager();
    ALOGI(“ServiceManager: %p”, sm.get());
    sm->addService(String16(“service.test”),new Test ());
    IPCThreadState::self()->joinThreadPool();
    }

    sp<IServiceManager> sm = defaultServiceManager();

    我们实际得到了servicemanager的binder proxy,通过这个接口我们可以调用servicemanager的方法addservice.

    sm->addService(String16("service.test"),new Test ());

    把我们提供的bbinder提供给servicemanager,前面的那个名字必须是唯一的.

    IPCThreadState::self()->joinThreadPool();

    有了joinThreadPool以后,我们就可以持续的提供服务了.

2 看一下test这个类的实现
test.h

class Test : public BnTest{  
public:  
    inline uint32_t  getTest(){  
        ALOGD("getTest===== %d",IPCThreadState::self()->getCallingUid());   
        return value;  
    }  
    inline void setTest(uint32_t par){  
        ALOGD("setTest===== %d",IPCThreadState::self()->getCallingUid());  
        value = par;  
    }  
private:  
    uint32_t value;  
};  

我们的test类是继承了BnTest,它是具体的干活的类

ITest.h

class ITest : public IInterface{

public:
    DECLARE_META_INTERFACE(Test);
    virtual uint32_t getTest() = 0;
    virtual void setTest(uint32_t ) = 0;
};
class BnTest : public BnInterface<ITest>{

    public:
        virtual status_t  onTransact(uint32_t code,
                              const Parcel& data,
                              Parcel* reply,
                              uint32_t flags= 0 );

};  

ITest就相当于是aidl的接口定义了
ITest.cpp

enum{
GET_Test = 1,
SET_Test,
};
class BpTest: public BpInterface<ITest>{
    public:
    BpTest(const sp<IBinder>& impl)
        : BpInterface<ITest>(impl){
    }

    virtual uint32_t getTest(){
        Parcel data,reply;
        data.writeInterfaceToken(ITest::getInterfaceDescriptor());
        remote()->transact(GET_Test,data,&reply);
        return reply.readInt32();

    }
    virtual void setTest(uint32_t params){
        Parcel data,reply;
        data.writeInterfaceToken(ITest::getInterfaceDescriptor());
        data.writeInt32(params);
        remote()->transact(SET_Test,data,&reply);
        return;

    }


};
IMPLEMENT_META_INTERFACE(Test,"android.Test.ITest");

status_t BnTest::onTransact(uint32_t code,
                        const Parcel& data,
                        Parcel* reply,
                        uint32_t flags){
    switch(code){
    case GET_Test:{
        CHECK_INTERFACE(ITest,data,reply);
        reply->writeInt32(getTest());
        return NO_ERROR;
        }break;
    case SET_Test:{
        CHECK_INTERFACE(ITest,data,reply);
        uint32_t value = data.readInt32();
        setTest(value);

        return NO_ERROR;
        }break;
    default:
    return BBinder::onTransact(code, data, reply, flags);


}
}

而ITest几乎也是照着模板写的,Google自己肯定写了类似于aidl的工具来生成native的service.

完整的代码可以参考testnativeservice

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值