HIDL インターフェースの関数は、自動生成された IFoo C++ クラス宣言のメソッドにマッピングされます。各関数の名前は C++ でも維持されます。ここでは、HIDL 引数および戻り値が C++ に変換される方法について説明します。
関数のパラメータ
.hal ファイルにリストされている引数は、C++ データ型にマッピングされます。
C++ プリミティブ型にマッピングされない引数は、const 参照によって渡されます。
戻り値を持つ(generates ステートメントを持つ)HIDL 関数ごとに、その関数の C++ パラメータ リストには追加の引数(HIDL 関数の戻り値で呼び出されるコールバック関数)があります。ただし、例外が 1 つあります。generates 句に C++ プリミティブへ直接マッピングする単一のパラメータが含まれる場合、コールバックの「省略」が使用されます(コールバックは削除されますが、戻り値は通常の return ステートメントを介して関数から返されます)。
関数の戻り値
次の関数には戻り値があります。
トランスポート エラーと戻り値の型
generates ステートメントは、次の 3 種類の関数シグネチャになります。
- C++ プリミティブである戻り値が 1 つだけの場合、
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() の場合に値を提供します。また、このメソッドは、クライアント プロセスが強制終了されないように、戻りオブジェクトを自動的に OK としてマークします。
コールバック パラメータを使って値を返す
コールバックは、HIDL 関数の戻り値を呼び出し元に渡します。
コールバックのプロトタイプは、C++ 型にマッピングされたパラメータ(generates ステートメントから取得)を持つ std::function オブジェクトです。この戻り値は void で、コールバック自体は値を返しません。
コールバック パラメータを持つ C++ 関数の戻り値の型は Return<void> です。サーバーの実装は、戻り値の提供のみを行います。戻り値はすでにコールバックを使用して転送されているため、T テンプレートのパラメータは次のように void となります。
Return<void> someMethod(someMethod_cb _cb);
C++ の実装から、サーバーの実装は Void()(Return<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 というキーワードでマークされた関数は非同期関数(クライアントは実行をブロックしない)で、戻り値を持ちません。oneway 関数の C++ シグネチャはパラメータ リストにコールバック パラメータを持たず、C++ 戻り値は Return<void> となります。