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>
となります。