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 einemReturn<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 gibtReturn<void>
zurück. - Wenn keine
generates
-Anweisung vorhanden ist, gibt die FunktionReturn<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>
.