函式

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>