设为首页 加入收藏

TOP

如何从Python代码中直接访问Android的Service(一)
2014-11-23 21:40:03 来源: 作者: 【 】 浏览:38
Tags:如何 Python 代码 直接 访问 Android Service

binder_wrap.h



#ifndef BINDER_WRAP_H


#define BINDER_WRAP_H




#ifdef __cplusplus


extern "C" {


#endif



typedef int (*vector_visitor)(const char16_t* str16,int length,void *data);


typedef int (*fnOnTransact)(uint32_t code,const void *data,void *reply,uint32_t flags,void *userData);


int server_create(const char *name,const char *descriptor,fnOnTransact onTrans,void *data);



void* binder_getbinder(const char *name);


int binder_releasebinder(void* binder);


int binder_listServices(vector_visitor visitor,void *data);


int binder_getInterfaceDescriptor(void *binder,char16_t *descriptor,size_t size);


int binder_transact(void* binder,int code,const void *data,void* reply,int flags);


void* parcel_new();


int parcel_destroy(void* parcel);


int parcel_writeInterfaceToken(void* parcel,const char *interface);


int parcel_writeInt32(void *parcel,int val);


int parcel_writeCString(void *parcel,const char* str);


int parcel_writeString16(void *parcel,const char16_t* str, size_t len);



int parcel_readInt32(void *parcel);


long parcel_readInt64(void *parcel);


int parcel_readString16(void *parcel,char16_t* str, size_t len);


int parcel_readInplace(void *parcel,void* data, int len);


int parcel_readExceptionCode(void *parcel);


int parcel_dataAvail(void *parcel);



#ifdef __cplusplus


}


#endif



#endif


binder_wrap.cpp



#include


#include


#include



#include


#include


#include


#include



#include



#include "binder_wrap.h"



using namespace android;



void* binder_getbinder(const char *name)


{


android::sp sm = android::defaultServiceManager();


sp *binder = new sp();


do {


*binder = sm->getService(android::String16(name));


if (binder != 0)


{


break;


}


usleep(500000); // 0.5 s


} while(true);


return reinterpret_cast(binder);


}



int binder_releasebinder(void* binder)


{


sp *bp = reinterpret_cast *>(binder);



if(bp == 0)


{


return 0;


}



delete bp;



return 1;


}



//Vector listServices() = 0;


int binder_listServices(vector_visitor visitor,void *data)


{


android::sp sm = android::defaultServiceManager();



Vector list = sm->listServices();



for (int i=0;i

{


visitor(list[i].string(),list[i].size(),data);


}



return list.size();


}



int binder_getInterfaceDescriptor(void *binder,char16_t *descriptor,size_t size)


{


sp *bp = reinterpret_cast *>(binder);



if(bp == 0)


{


return 0;


}



if (descriptor == NULL || size <= 0)


{


return 0;


}



String16 des = (*bp)->getInterfaceDescriptor();



if (size > des.size())


{


size = des.size();


}



memcpy(descriptor,des.string(),size*2);



return size;


}



//int binder_transact(void* binder,int code,const Parcel& data,Parcel* reply,int flags = 0)


int binder_transact(void* binder,int code,const void *data,void* reply,int flags)


{


sp *bp = reinterpret_cast *>(binder);



if(bp == 0 || data == 0 || reply == 0)


{


return 0;


}


return (*bp)->transact(code,*(Parcel*)data,(Parcel*)reply,flags);


}



void* parcel_new()


{


return (void*)new Parcel();


}



int parcel_destroy(void* parcel)


{


if(parcel == 0)


{


return 0;


}


delete (Parcel*)parcel;


return 1;


}



int parcel_writeInterfaceToken(void* parcel,const char *interface)


{


Parcel *p = reinterpret_cast(parcel);



if(p == 0)

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇理解 Linux 条件变量 下一篇Android异步任务的使用方法

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: