HIDL 인터페이스의 함수는 자동 생성된 IFoo
C++ 클래스 선언의 메서드에 매핑됩니다. 각 함수의 이름은 C++에서 동일하게 유지됩니다. 다음 섹션에서는 HIDL 인수 및 반환 값이 C++로 변환되는 방법을 설명합니다.
함수 매개변수
.hal
파일에 나열된 인수는 C++ 데이터 유형에 매핑됩니다.
프리미티브 C++ 유형에 매핑되지 않는 인수는 const 참조로 전달됩니다.
반환 값이 있는 모든 HIDL 함수(generates
문 포함)의 경우 이 함수의 C++ 매개변수 목록에는 HIDL 함수의 반환 값을 사용하여 호출되는 콜백 함수인 추가 인수가 있습니다.
한 가지 예외가 있습니다. generates
절에 C++ 프리미티브에 직접 매핑되는 단일 매개변수가 포함되어 있는 경우 콜백 생략이 사용됩니다(콜백은 삭제되고 반환 값이 일반 return
문을 통해 함수에서 반환됨).
함수 반환 값
다음 함수에는 반환 값이 있습니다.
전송 오류 및 반환 유형
generates
문으로 다음과 같은 세 가지 유형의 함수 서명을 생성할 수 있습니다.
- 단 하나의 반환 값인 C++ 프리미티브의 경우
generates
반환 값은Return<T>
객체의 함수에서 값으로 반환됩니다. - 더 복잡한 경우
generates
반환 값은 함수 호출 자체와 함께 제공된 콜백 매개변수를 통해 반환되고 함수는Return<void>
를 반환합니다. generates
문이 없으면 함수는Return<void>
를 반환합니다.
RPC 호출은 서버가 끊어지거나 전송 리소스가 호출을 완료하기에 부족하거나 전달된 매개변수가 호출 완료를 허용하지 않는 경우(예: 필수 콜백 함수 누락)와 같은 전송 오류가 발생할 수 있습니다. Return
객체는 전송 오류 표시뿐만 아니라 T
값(Return<void>
제외)도 저장합니다.
클라이언트 측 함수와 서버 측 함수의 서명이 동일하므로 서버 측 함수는 구현에서 전송 오류 신호를 보내지 않더라도 Return
유형을 반환해야 합니다. Return<T>
객체는 Return(myTValue)
로 구성되거나 return
문과 같이 mTValue
에서 암시적으로 구성될 수 있으며 Return<void>
객체는 Void()
로 구성됩니다.
Return<T>
객체는 T
값과 암시적으로 상호 변환됩니다. Return
객체에서 isOk()
메서드를 호출하여 전송 오류를 검사할 수 있습니다. 이 검사는 필수가 아닙니다. 그러나 오류가 발생하고 Return
객체가 제거되거나 T
값의 변환이 시도될 때까지 검사하지 않으면 클라이언트 프로세스가 종료되고 오류가 기록됩니다. isOk()
가 개발자 코드의 논리 오류(예: nullptr
을 동기 콜백으로 전달)로 인한 전송 오류 또는 호출 실패를 표시하면 Return 객체에서 로깅에 적합한 문자열을 반환하기 위해 description()
을 호출할 수 있습니다. 이 경우 호출에 실패하여 서버에서 실행된 코드의 양을 확인할 수 없습니다. isDeadObject()
메서드도 제공됩니다. 이 메서드는 !isOk()
가 원격 객체가 비정상 종료되었거나 더 이상 존재하지 않기 때문에 있다는 것을 표시합니다. isDeadObject()
는 항상 !isOk()
를 암시합니다.
값으로 반환
generates
문이 단일 C++ 프리미티브에 매핑되면 매개변수 목록에 어떤 콜백 매개변수도 없습니다. 대신 구현에서는 프리미티브 유형 T
에서 암시적으로 생성될 수 있는 Return<T>
객체에 반환 값 T
를 제공합니다. 예를 들면 다음과 같습니다.
Return<uint32_t> someMethod() { uint32_t return_data = ...; // Compute return_data return return_data; };
Return<*>::withDefault
메서드도 제공됩니다. 이 메서드는 반환 값이 !isOk()
인 경우에 값을 제공합니다.
또한 이 메서드는 클라이언트 프로세스가 종료되지 않도록 자동으로 반환 객체를 okay로 표시합니다.
콜백 매개변수를 사용하여 반환
콜백은 HIDL 함수의 반환 값을 호출자에게 다시 전달할 수 있습니다.
콜백의 프로토타입은 C++ 유형에 매핑된 매개변수(generates
문에서 가져옴)가 포함된 std::function
객체입니다. 반환 값은 void이지만 콜백 자체는 값을 반환하지 않습니다.
콜백 매개변수가 있는 C++ 함수의 반환 값에는 Return<void>
유형이 있습니다. 서버 구현은 반환 값만 제공할 뿐입니다. 반환 값이 콜백을 사용하여 이미 전송되었으므로 T
템플릿 매개변수는 다음과 같이 void
입니다.
Return<void> someMethod(someMethod_cb _cb);
C++ 구현에서 서버 구현은 Return<void>
객체를 반환하는 정적 인라인 함수인 Void()
를 반환해야 합니다. 콜백 매개변수가 있는 일반적인 서버 메서드 구현의 예는 다음과 같습니다.
Return<void> someMethod(someMethod_cb _cb) { // Do some processing, then call callback with return data hidl_vec<uint32_t> vec = ... _cb(vec); return Void(); };
반환 값이 없는 함수
generates
문이 없는 함수의 C++ 서명에는 매개변수 목록에 콜백 매개변수가 없습니다. 반환 유형은 Return<void>.
입니다.
일방향 함수
oneway
키워드로 표시된 함수는 비동기 함수이므로 클라이언트가 실행을 차단하지 않으며 반환 값도 없습니다. oneway
함수의 C++ 서명에는 매개변수 목록에 콜백 매개변수가 없으며 C++ 반환 값은 Return<void>
입니다.