Hidl Service - Java Service共享内存

1. Hidl介绍

2. Android组件之Service

3. 通讯框架

3.1 框架

3.2 实现

3.2.2.  Hidl 部分以binary形式存在.  关键文件如下:

Android.bp:

// FIXME: your file license if you have one
cc_binary {
    name: "android.hardware.xxxx@1.0-service",
    init_rc: ["android.hardware.xxxx@1.0-service.rc"],
    vintf_fragments: ["android.hardware.xxxx@1.0-service.xml"],
    relative_install_path: "hw",
    vendor: true,
    srcs: [
	"xxxxHidl.cpp",
	"service.cpp",
    ],
    shared_libs: [
        "liblog",
        "libdl",
        "libutils",
        "libcutils",
        "libhardware",
        "libhidlbase",
	    "libhidlmemory",
        "libhidltransport",
	    "android.hidl.allocator@1.0",
	    "android.hidl.memory@1.0",
        "android.hardware.xxxx@1.0",
    ],
}

android.hardware.xxxx@1.0-service.xml:

<manifest version="1.0" type="device">
    <hal format="hidl">
        <name>android.hardware.xxxx</name>
        <transport>hwbinder</transport>
        <version>1.0</version>//版本
        <interface>
            <name>IxxxxHidl</name>//hidl接口名称
            <instance>default</instance>
        </interface>
    </hal>
</manifest>

android.hardware.xxxx@1.0-service.rc:

service xxxx1_0 /vendor/bin/hw/android.hardware.xxxx@1.0-service
    class hal
    user system
    group system

service.cpp:

#define LOG_TAG "android.hardware.xxxx@1.0-service"

#include <android/hardware/xxxx/1.0/IxxxxHidl.h>
#include <hidl/LegacySupport.h>
#include <hidl/HidlTransportSupport.h>
#include "xxxxHidl.h"

using android::hardware::xxxx::V1_0::IxxxxHidl;
using android::hardware::xxxx::V1_0::implementation::xxxxHidl;
//using android::hardware::defaultPassthroughServiceImplementation;
using android::hardware::configureRpcThreadpool;
using android::hardware::joinRpcThreadpool;
using android::sp;
using android::status_t;
using android::OK;


int main() {
    configureRpcThreadpool(3, true);//max thread number for request.
    sp<IxxxxHidl> service = new xxxxHidl;
    status_t status = service->registerAsService();//注册服务
    ALOGW_IF(status != OK, "Could not register xxxxHidl v1.0");
    ALOGD("Default service is ready.");

    joinRpcThreadpool();
    return 1;

}

3.2.3 Hidl共享内存


namespace {
// hidl数组转共享内存接口//
// Moves the data from the vector into allocated shared memory,
// emptying the vector.
// It is assumed that the passed hidl_memory is a null object, so it's
// not reset if the vector is empty.
// The caller needs to keep the returned sp<IMemory> as long as
// the data is needed.
std::pair<bool, sp<IMemory>> moveVectorToMemory(hidl_vec<uint8_t>* v, hidl_memory* mem) {
    sp<IMemory> memory;
    if (v->size() == 0) {
        return std::make_pair(true, memory);
    }
    sp<IAllocator> ashmem = IAllocator::getService("ashmem");
    if (ashmem == 0) {
        ALOGE("Failed to retrieve ashmem allocator service");
        return std::make_pair(false, memory);
    }
    bool success = false;
    Return<void> r = ashmem->allocate(v->size(), [&](bool s, const hidl_memory& m) {
        success = s;
        if (success) *mem = m;
    });
    if (r.isOk() && success) {
        memory = hardware::mapMemory(*mem);
        if (memory != 0) {
            memory->update();
            memcpy(memory->getPointer(), v->data(), v->size());
            memory->commit();
            v->resize(0);
            return std::make_pair(true, memory);
        } else {
            ALOGE("Failed to map allocated ashmem");
        }
    } else {
        ALOGE("Failed to allocate %llu bytes from ashmem", (unsigned long long)v->size());
    }
    return std::make_pair(false, memory);
}
}

使用案例://moveVectorToMemory使用例子

/*****************************************************************************
function:     ProcessData
description:  socket data callback workflow
input:        uint8_t*,uint32_t
output:       none
return:       0 indicates success.
              -1 indicates failed.
*****************************************************************************/
uint32_t VmSocketClient::ProcessData(uint8_t *buf,uint32_t length)
{
	//callback data//
	pthread_mutex_lock(&mLock_read);//lock//
	hidl_vec<uint8_t> rx_data;
	rx_data.setToExternal(buf, length);
	mHidlBuffer.length = rx_data.size();
	moveVectorToMemory(&rx_data,&(mHidlBuffer.data));
	if(mCallback!=NULL)
		mCallback->processData(mHidlBuffer);
	pthread_mutex_unlock(&mLock_read);//unlock//
	return 0;
}

callback接口://IxxxxHidlCallback.hal

interface IxxxxHidlCallback {
 	
	oneway processData(xxxx_buffer buf);
	oneway notify(uint32_t msg);
 	
};

type.hal 定义:

struct xxxx_buffer {
	uint64_t id;
	uint32_t length;
	memory data; //内存
};

3.2.4 java共享内存:

import android.os.HidlMemory;
import android.os.HidlMemoryUtil;
import android.hardware.xxxx.V1_0.IxxxxHidlCallback;
import android.hardware.xxxx.V1_0.xxxx_buffer;


//xxxx hidl callback 
private class HidlCallback extends IxxxxHidlCallback.Stub {
    private xxxxHidlManager mManager;

	HidlCallback(xxxxHidlManager manager) {
		this.mManager = manager;
	}
		
	@Override
	public void processData(Spicom_buffer buf)
	{
        //内存转Byte数组
		byte[] buffer = HidlMemoryUtil.hidlMemoryToByteArray(buf.data);
		int length = buf.length;
	}
		
	@Override
	public void notify(int msg)
	{

	}
}
//end

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

村里小码农

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值