Funktionen

Funktionen in einer HIDL-Schnittstelle werden Methoden in der automatisch generierten IFoo Deklaration der C++-Klasse. Der Name jeder Funktion bleibt gleich in C++; In den folgenden Abschnitten wird beschrieben, wie HIDL-Argumente werden in C++ übersetzt.

Funktionsparameter

Die in der Datei .hal aufgeführten Argumente sind C++-Datentypen zugeordnet. Argumente, die keinem primitiven C++-Typ zugeordnet sind, werden mit const übergeben. Referenz.

Für jede HIDL-Funktion mit einem Rückgabewert (mit einem generates -Anweisung) enthält, enthält die C++ Parameterliste für diese Funktion ein zusätzliches Argument: eine Rückruffunktion, die mit den Rückgabewerten der HIDL-Funktion aufgerufen wird. Es gibt eine Ausnahme: Wenn die generates-Klausel enthält einen einzelnen Parameter, der direkt einer C++-Primitiven, Callback-Funktion zugeordnet ist. elision wird verwendet (der Callback wird entfernt und der Rückgabewert ist über eine normale return-Anweisung zurückgegeben.

Rückgabewerte der Funktion

Die folgenden Funktionen haben Rückgabewerte.

Transportfehler und Rückgabetyp

Die generates-Anweisung kann zu drei Arten von Funktionen führen Signaturen:

  • Für nur einen Rückgabewert, der eine C++-Primitive ist, Der Rückgabewert generates wird als Wert aus der Funktion in einem Return<T>-Objekt.
  • Für kompliziertere Fälle sind die generates-Rückgabewerte wird über den Callback-Parameter zurückgegeben, der mit dem Funktionsaufruf selbst bereitgestellt wurde. und die Funktion gibt Return<void> zurück.
  • Wenn keine generates-Anweisung vorhanden ist, gibt die Funktion Return<void>.

Bei RPC-Aufrufen können gelegentlich Transportfehler auftreten, z.B. wenn der Server abstürzt, wenn die Transportressourcen für den Anruf nicht ausreichen oder wenn Die übergebenen Parameter verhindern das Abschließen des Aufrufs (z. B. wenn ein Callback-Funktion erforderlich). Return Objektspeicher-Transportfehler sowie einen T-Wert mit Ausnahme von Return<void>.

Da die clientseitigen und serverseitigen Funktionen dieselbe Signatur haben, muss die serverseitige Funktion einen Return-Typ zurückgeben, auch wenn -Implementierung signalisiert keine Transportfehler. Return<T> Objekte werden mit Return(myTValue) konstruiert (oder können implizit aus mTValue, z. B. return Anweisungen) und Return<void>-Objekte werden mit Void()

Return<T>-Objekte haben eine implizite Konvertierung in und aus ihren T-Wert. Das Return-Objekt kann auf Transportfehler durch Aufrufen der isOk()-Methode. Diese Prüfung ist nicht erforderlich; Wenn jedoch ein Fehler auftritt und nicht bis zum Das Return-Objekt wird gelöscht oder eine T-Wert-Conversion ist versucht, wird der Clientprozess abgebrochen und ein Fehler protokolliert. Wenn isOk() gibt einen Transportfehler oder einen Anruffehler aufgrund einer Logik an Fehler im Entwicklercode zurückgegeben, z. B. wenn nullptr als synchrones kann description() auf dem Return-Objekt aufgerufen werden, gibt einen für die Protokollierung geeigneten String zurück. In solchen Fällen gibt es keine Möglichkeit, ermitteln, wie viel Code möglicherweise aufgrund des Fehlers Anruf fehlgeschlagen. Außerdem wird die Methode isDeadObject() bereitgestellt. Dieses gibt an, dass !isOk() liegt, weil das Remote-Objekt über ist abgestürzt oder ist nicht mehr vorhanden. isDeadObject() impliziert immer !isOk().

Rückgabe nach Wert

Wenn die Anweisung generates einer einzelnen C++-Primitive zugeordnet ist, gibt es Callback-Parameter befindet sich in der Parameterliste. Stattdessen bietet eine Implementierung den Rückgabewert T in einem Return<T>-Objekt, das kann implizit aus dem primitiven Typ T generiert werden. Für Beispiel:

Return<uint32_t> someMethod() {
    uint32_t return_data = ...; // Compute return_data
    return return_data;
};

Außerdem wird die Methode Return<*>::withDefault bereitgestellt. Dieses stellt einen Wert bereit, wenn der Rückgabewert !isOk() ist. Diese Methode markiert auch automatisch das Rückgabeobjekt als in Ordnung, sodass der Client wird nicht beendet.

Rückgabe mit Callback-Parameter

Ein Callback kann den Rückgabewert der HIDL-Funktion an den Aufrufer zurückgeben. Der Prototyp des Callbacks ist ein std::function-Objekt mit Parameter (aus der Anweisung generates), die der C++- Typen. Der Rückgabewert ist "void", d. h. der Callback selbst gibt keinen Wert zurück.

Der Rückgabewert einer C++-Funktion mit einem Callback-Parameter hat den Typ Return<void> Die Serverimplementierung ist nur zur Angabe des Rückgabewerts. Da die Rückgabewerte bereits übertragen wurden, Bei Verwendung des Callbacks lautet der T-Vorlagenparameter void:

Return<void> someMethod(someMethod_cb _cb);

Aufgrund der C++-Implementierung sollte die Serverimplementierung Void(), eine statische Inline-Funktion, die einen Return<void>-Objekt. Beispiel für eine typische Servermethode Implementierung mit einem Callback-Parameter:

Return<void> someMethod(someMethod_cb _cb) {
    // Do some processing, then call callback with return data
    hidl_vec<uint32_t> vec = ...
    _cb(vec);
    return Void();
};

Funktionen ohne Rückgabewerte

Die C++-Signatur einer Funktion ohne generates-Anweisung hat keinen Callback-Parameter in der Parameterliste. Der Rückgabetyp Return<void>. sein

Einwegfunktionen

Mit dem Schlüsselwort oneway gekennzeichnete Funktionen sind asynchron (Clients blockieren ihre Ausführung nicht) und haben keinen Rückgabewert Werte. Die C++-Signatur einer oneway-Funktion hat kein Callback-Parameter in der Parameterliste aufgeführt und sein C++-Rückgabewert Return<void>.