AHardwareBuffer は、gralloc のバッファをラップする共有メモリの一種です。Android 10 では、ニューラル ネットワーク API(NNAPI)が AHardwareBuffer の使用をサポートし、データをコピーせずにドライバを実行できるため、アプリのパフォーマンスと消費電力が改善します。たとえば、カメラ HAL のスタックは、カメラ NDK の API とメディア NDK の API で生成された AHardwareBuffer ハンドルを使用して、AHardwareBuffer オブジェクトを機械学習ワークロードの NNAPI に渡すことができます。詳しくは ANeuralNetworksMemory_createFromAHardwareBuffer
をご覧ください。
NNAPI で使用される AHardwareBuffer オブジェクトは、hardware_buffer
または hardware_buffer_blob
と名付けられた hidl_memory
構造体を介してドライバに渡されます。hidl_memory
構造体 hardware_buffer_blob
は、AHARDWAREBUFFER_FORMAT_BLOB
形式の AHardwareBuffer オブジェクトのみを表します。
フレームワークで必要な情報は、hidl_memory
構造体の hidl_handle
フィールドでエンコードされます。hidl_handle
フィールドは native_handle
をラップして、AHardwareBuffer または Gralloc バッファに関する必須のメタデータをすべてエンコードします。
ドライバは、提供された hidl_handle
フィールドを適切にデコードして、 によって記述されたメモリにアクセスする必要があります。getSupportedOperations_1_2
、getSupportedOperations_1_1
、または getSupportedOperations
メソッドが呼び出されると、ドライバは、提供された hidl_handle
をデコードして hidl_handle
によって記述されたメモリにアクセスできるかどうかを検出します。定数オペランドに使用する hidl_handle
フィールドがサポートされていない場合、モデルの準備は必ず失敗します。入力または出力オペランドに使用する hidl_handle
フィールドがサポートされていない場合、その実行は必ず失敗します。モデルの準備や実行が失敗した場合、ドライバは GENERAL_FAILURE
エラーコードを返すことが推奨されます。