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

~/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

#include

#include

#define SHARED_BUFFER_SERVICE "shy.luo.SharedBuffer"

#define SHARED_BUFFER_SIZE 4

#define LOGD ALOGD

#define LOGE ALOGE

#define LOGI ALOGI

#define LOGW ALOGW

using namespace android;

class ISharedBuffer: public IInterface

{

public:

DECLARE_META_INTERFACE(SharedBuffer);

virtual sp getBuffer() = 0;

};

class BnSharedBuffer: public BnInterface

{

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

#include

#include "ISharedBuffer.h"

using namespace android;

enum

{

GET_BUFFER = IBinder::FIRST_CALL_TRANSACTION

};

class BpSharedBuffer: public BpInterface

{

public:

BpSharedBuffer(const sp& impl)

: BpInterface(impl)

{

}

sp getBuffer()

{

Parcel data;

data.writeInterfaceToken(ISharedBuffer::getInterfaceDescriptor());

Parcel reply;

remote()->transact(GET_BUFFER, data, &reply);

sp buffer = interface_cast (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 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 := optional

LOCAL_SRC_FILES := ../common/ISharedBuffer.cpp \

SharedBufferServer.cpp

LOCAL_SHARED_LIBRARIES := libcutils libutils libbinder

LOCAL_MODULE := SharedBufferServer

include $(BUILD_EXECUTABLE)

server/SharedBufferServer.cpp

#define LOG_TAG "ISharedBufferServer"

#define TAG "[Server] "

#include

#include

#include

#include

#include

#include

#include

#include "../common/ISharedBuffer.h"

class SharedBufferService : public BnSharedBuffer

{

public:

SharedBufferService ()

{

sp 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 getBuffer()

{

return mMemory;

}

private:

sp 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 := optional

LOCAL_SRC_FILES := ../common/ISharedBuffer.cpp \

SharedBufferClient.cpp

LOCAL_SHARED_LIBRARIES := libcutils libutils libbinder

LOCAL_MODULE := SharedBufferClient

include $(BUILD_EXECUTABLE)

client/SharedBufferClient.cpp

#define LOG_TAG "SharedBufferClient"

#include

#include

#include

#include "../common/ISharedBuffer.h"

int main()

{

sp binder = defaultServiceManager()->getService(String16(SHARED_BUFFER_SERVICE));

if(binder == NULL){

printf("Failed to get service: %s.\n", SHARED_BUFFER_SERVICE);

return -1;

}

sp service = ISharedBuffer::asInterface(binder);

if(service == NULL){

return -2;

}

sp 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;

}

运行结果:

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值