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