多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內(nèi)最全I(xiàn)T社區(qū)平臺 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當(dāng)前位置:首頁 > php開源 > 綜合技術(shù) > 如何寫一個native層的service

如何寫一個native層的service

來源:程序員人生   發(fā)布時間:2015-04-09 08:44:39 閱讀次數(shù):3208次

android的service大概有這么幾種情勢,Java service ,native service,或Java層通過某種通訊方式比如socket和demon交互.
Java層的aidl很方便,寫socket的demon方式也很好理解,native的就顯得略微麻煩1點,我們通過1個例子來講1下,首先說我們不講授binder的內(nèi)部機制….
我們打算寫個簡單的service,只提供set和get方法
1. 先寫1個bin 的可履行文件

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


sp<IServiceManager> sm = defaultServiceManager();

我們實際得到了servicemanager的binder proxy,通過這個接口我們可以調(diào)用servicemanager的方法addservice.

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

把我們提供的bbinder提供給servicemanager,前面的那個名字必須是唯1的.

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

有了joinThreadPool以后,我們就能夠延續(xù)的提供服務(wù)了.

2 看1下test這個類的實現(xiàn)
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就相當(dāng)因而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.

生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對您的學(xué)習(xí)有所幫助,可以手機掃描二維碼進(jìn)行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關(guān)閉
程序員人生
主站蜘蛛池模板: 国产亚洲精品福利片 | 麻豆精品成人免费国产片 | avtt亚洲 | 久久精品视频7 | 欧美黑人xxxx猛战黑人 | 99精品久久秒播无毒不卡 | 2021最新热播中文字幕 | 秋霞午夜限制土鳖免费观看 | oo0xxxx性欧美野外 | 亚洲精品久久久成人 | 亚洲图片偷拍自拍 | 国产精品久久久久三级 | 老司机午夜在线视频免费观 | 色综合91 | 精品伊人久久大香线蕉网站 | 91精品国产美女福到在线不卡 | 欧美人成人亚洲专区中文字幕 | 午夜dj视频在线视频中文 | 日韩亚洲欧美综合 | 亚洲欧洲一区 | 久久 在线播放 | 亚洲 春色 古典 小说 自拍 | 亚洲天堂网站在线 | 美国一级毛片在线观看 | 第一福利网站 | 自拍三区播| 亚洲激情视频在线播放 | 亚洲18卡通动漫在线播放 | 成人免费体验区福利云点播 | 东方aⅴ免费观看久久av | 久久久久久久久久久观看 | 国产真实女人一级毛片 | 第一福利在线观看 | 中文字幕亚洲一区二区三区 | 无码中文av有码中文av | 国产丰满眼镜女在线观看 | xxxxxx日本处大片免费看 | 在线免费亚洲 | 日本不卡免费新一二三区 | 日本aa大片在线播放免费看 | 欧美极品videosvideo激情 欧美极品video粗暴 |