Android Ashmem匿名共享内存 C++实例

来源:互联网 发布:逆战刷nz点软件免费版 编辑:程序博客网 时间:2024/06/05 05:39

~/Android/external/ashmem

----common

      ----ISharedBuffer.h

      ----ISharedBuffer.cpp

----server

      ----SharedBufferServer.cpp

      ----Android.mk

----client

      ----SharedBufferClient.cpp

      ----Android.mk


common/ISharedBuffer.h

#ifndef ISHAREDBUFFER_H_#define ISHAREDBUFFER_H_#include <utils/RefBase.h>#include <binder/IInterface.h>#include <binder/Parcel.h>#define SHARED_BUFFER_SERVICE "shy.luo.SharedBuffer"#define SHARED_BUFFER_SIZE 4#define LOGD ALOGD#define LOGE ALOGE#define LOGI ALOGI#define LOGW ALOGWusing namespace android;class ISharedBuffer: public IInterface{public:DECLARE_META_INTERFACE(SharedBuffer);virtual sp<IMemory> getBuffer() = 0;};class BnSharedBuffer: public BnInterface<ISharedBuffer>{public:virtual status_t onTransact (uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags = 0);};#endif


common/ISharedBuffer.cpp

#define LOG_TAG "ISharedBuffer"#include <utils/Log.h>#include <binder/MemoryBase.h>#include "ISharedBuffer.h"using namespace android;enum{GET_BUFFER = IBinder::FIRST_CALL_TRANSACTION};class BpSharedBuffer: public BpInterface<ISharedBuffer>{public:BpSharedBuffer(const sp<IBinder>& impl): BpInterface<ISharedBuffer>(impl){}sp<IMemory> getBuffer(){Parcel data;data.writeInterfaceToken(ISharedBuffer::getInterfaceDescriptor());Parcel reply;remote()->transact(GET_BUFFER, data, &reply);sp<IMemory> buffer = interface_cast<IMemory> (reply.readStrongBinder());return buffer;}};IMPLEMENT_META_INTERFACE(SharedBuffer, "shy.luo.ISharedBuffer");status_t BnSharedBuffer::onTransact(uint32_t code, const Parcel & data, Parcel * reply, uint32_t flags){switch(code){case GET_BUFFER:{CHECK_INTERFACE(ISharedBuffer, data, reply);sp<IMemory> buffer = getBuffer();if(buffer != NULL){reply->writeStrongBinder(buffer->asBinder(buffer));}return NO_ERROR;}default:{return BBinder::onTransact( code, data, reply, flags);}}}

server/Android.mk

LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE_TAGS := optionalLOCAL_SRC_FILES := ../common/ISharedBuffer.cpp \SharedBufferServer.cppLOCAL_SHARED_LIBRARIES := libcutils libutils libbinderLOCAL_MODULE := SharedBufferServerinclude $(BUILD_EXECUTABLE)


server/SharedBufferServer.cpp

#define LOG_TAG "ISharedBufferServer"#define TAG "[Server] "#include <stdlib.h>#include <fcntl.h>#include <utils/Log.h>#include <binder/MemoryBase.h>#include <binder/MemoryHeapBase.h>#include <binder/IServiceManager.h>#include <binder/IPCThreadState.h>#include "../common/ISharedBuffer.h"class SharedBufferService : public BnSharedBuffer{public:SharedBufferService (){sp<MemoryHeapBase> heap = new MemoryHeapBase(SHARED_BUFFER_SIZE, 0, "SharedBuffer");if(heap != NULL){mMemory = new MemoryBase(heap, 0, SHARED_BUFFER_SIZE);int32_t* data = (int32_t*)mMemory->pointer();if(data != NULL){*data = 0;}}}virtual ~SharedBufferService (){mMemory = NULL;}public:static void instantiate (){defaultServiceManager ()->addService(String16(SHARED_BUFFER_SERVICE), new SharedBufferService());}virtual sp<IMemory> getBuffer(){return mMemory;}private:sp<MemoryBase> mMemory;};int main(int argc, char** argv){SharedBufferService::instantiate();ProcessState::self()->startThreadPool();IPCThreadState::self()->joinThreadPool();return 0;}

client/Android.mk

LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE_TAGS := optionalLOCAL_SRC_FILES := ../common/ISharedBuffer.cpp \SharedBufferClient.cppLOCAL_SHARED_LIBRARIES := libcutils libutils libbinderLOCAL_MODULE := SharedBufferClientinclude $(BUILD_EXECUTABLE)


client/SharedBufferClient.cpp

#define LOG_TAG "SharedBufferClient"#include <utils/Log.h>#include <binder/MemoryBase.h>#include <binder/IServiceManager.h>#include "../common/ISharedBuffer.h"int main(){sp<IBinder> binder = defaultServiceManager()->getService(String16(SHARED_BUFFER_SERVICE));if(binder == NULL){printf("Failed to get service: %s.\n", SHARED_BUFFER_SERVICE);return -1;}sp<ISharedBuffer> service = ISharedBuffer::asInterface(binder);if(service == NULL){return -2;}       sp<IMemory> buffer = service->getBuffer();if(buffer == NULL){return -3;}int32_t* data = (int32_t*)buffer->pointer();if(data == NULL){return -4;}printf("The value of the shared buffer is %d. \n", *data);*data = *data + 1;printf("Add value 1 to the shared buffer. \n");return 0;}

运行结果:




0 0