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
sp
do {
*binder = sm->getService(android::String16(name));
if (binder != 0)
{
break;
}
usleep(500000); // 0.5 s
} while(true);
return reinterpret_cast
}
int binder_releasebinder(void* binder)
{
sp
if(bp == 0)
{
return 0;
}
delete bp;
return 1;
}
//Vector
int binder_listServices(vector_visitor visitor,void *data)
{
android::sp
Vector
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 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 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 if(p == 0)