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;
-
- }
-
- 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
as long as - // the data is needed.
- std::pair<bool, sp
> moveVectorToMemory(hidl_vec* v, hidl_memory* mem) { - sp
memory; - if (v->size() == 0) {
- return std::make_pair(true, memory);
- }
- sp
ashmem = IAllocator::getService("ashmem"); - if (ashmem == 0) {
- ALOGE("Failed to retrieve ashmem allocator service");
- return std::make_pair(false, memory);
- }
- bool success = false;
- Return
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