함수

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>입니다.