Android系统匿名共享内存(Anonymous Shared Memory)C++调用接口分析(6)
接下来,我们再来看看server模块的实现。在external/ashmem/common目录下,只有一个源文件SharedBufferServer.cpp,它实现了内存共享服务SharedBufferService:
- #define LOG_TAG "SharedBufferServer"
- #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;
- }
- LOCAL_PATH := $(call my-dir)
- include $(CLEAR_VARS)
- LOCAL_MODULE_TAGS := optional
- LOCAL_SRC_FILES := ../common/ISharedBuffer.cpp \
- SharedBufferServer.cpp
- LOCAL_SHARED_LIBRARIES:= libcutils libutils libbinder
- LOCAL_MODULE := SharedBufferServer
- include $(BUILD_EXECUTABLE)
- #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;
- }