HIDL 介面中的函式會對應至自動產生的方法
IFoo
C++ 類別宣告。各函式的名稱仍會保留
在 C++ 中也相同;以下各節將說明 HIDL 引數與傳回的方式
都會轉譯為 C++
函式參數
.hal
檔案中列出的引數與 C++ 資料類型對應。
未對應至原始 C++ 類型的引數會由 const 傳遞
參照。
針對含有回傳值 (具有 generates
) 的每個 HIDL 函式
陳述式的情況下,該函式的 C++ 參數清單會包含其他引數:
系統會使用 HIDL 函式的傳回值呼叫回呼函式。
有一個例外狀況:如果 generates
子句
包含單一參數,可直接對應至 C++ 原始、回呼
使用 elision (移除回呼,傳回的值為
透過一般 return
陳述式傳回函式)。
函式回傳值
以下函式含有傳回值。
傳輸錯誤和傳回類型
generates
陳述式會產生三種函式類型
簽章:
- 針對一個 C++ 基本形式的傳回值,
generates
傳回值是由函式中的值傳回。Return<T>
物件。 - 若是較複雜的情況,傳回
generates
的值為 透過函式呼叫本身的回呼參數傳回; 而函式會傳回Return<void>
- 如果沒有
generates
陳述式,函式會傳回以下結果Return<void>
。
RPC 呼叫偶爾可能會發生傳輸錯誤,例如:伺服器執行
傳輸資源不足以完成呼叫時
傳送的參數不允許完成呼叫 (例如缺少
必要的回呼函式)。Return
物件儲存傳輸錯誤
指標的 以及 T
值 (除了
Return<void>
)。
由於用戶端和伺服器端函式擁有相同的簽章,
伺服器端函式必須傳回 Return
類型,即使
但不會指出傳輸錯誤。Return<T>
物件是使用 Return(myTValue)
建構而成 (或能以隱含方式
從 mTValue
建構,例如 return
陳述式) 和 Return<void>
物件
Void()
。
Return<T>
物件與彼此之間的轉換隱含轉換
其 T
值。您可以為 Return
物件檢查
呼叫 isOk()
方法以解決傳輸錯誤。這項檢查
必要;但如果發生錯誤,且時間沒有檢查
Return
物件遭到刪除,或是 T
值的轉換為
用戶端處理程序就會終止,並記錄錯誤。如果
isOk()
表示因邏輯而發生傳輸錯誤或呼叫失敗
開發人員程式碼發生錯誤 (例如以同步方式傳遞 nullptr
回呼),然後可以在傳回物件上呼叫 description()
,以便給
會傳回適合記錄的字串。在這種情況下
以便判斷伺服器
呼叫失敗。您也可以使用 isDeadObject()
方法。這個
方法表示 !isOk()
是因為遠端物件
當機或已不存在isDeadObject()
一律表示
!isOk()
。
依值傳回結果
如果 generates
陳述式對應至單一 C++ 基元,否
回呼參數位於參數清單中。相反地
Return<T>
物件中的傳回值 T
,
可透過原始類型 T
隱含產生。例如:
Return<uint32_t> someMethod() { uint32_t return_data = ...; // Compute return_data return return_data; };
您也可以使用 Return<*>::withDefault
方法。這個
方法會提供一個值,並在傳回值為 !isOk()
的情況下。
這個方法也會自動將傳回物件標示為確認狀態,讓用戶端
都不會終止
使用回呼參數的傳回
回呼可以將 HIDL 函式的傳回值傳回至呼叫端。
回呼的原型為 std::function
物件,
從 generates
陳述式取得且對應至 C++ 的參數
。其傳回值無效,回呼本身不會傳回值。
含有回呼參數的 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
函式的 C++ 簽名不會有
參數清單中的回呼參數,其 C++ 傳回值會是
Return<void>
。