Add AHardwareBuffer support for NNAPI

   - The main purpose for AHardwareBuffer support is for model inputs &
   outputs.
   - ANeuralNetworks_setOperandValueFromMemory only accepts BLOB mode
   AHardwareBuffer.
   - ANeuralNetworks_set[Input|Output]FromMemory can accepts non-BLOB mode
   AHardwareBuffer. And for non-BLOB mode buffer, the entire buffer will
   be used.
   - There is no guarantee that arbitrary AHardwareBuffer can be used by
   arbitrary devices. The execution must fail if the driver cannot
   consume the buffer.
   - No CPU fallback for AHardwareBuffer except BLOB mode.

Test: mm
Test: NeuralNetworksTest_static
Change-Id: I9d9ac95aea1e56b583c06e4f9c9afdaab1403152
Merged-In: I9d9ac95aea1e56b583c06e4f9c9afdaab1403152
(cherry picked from commit 5777040ee6f93f4060f7efb6cffaf5bff37f99d8)
diff --git a/runtime/NeuralNetworks.cpp b/runtime/NeuralNetworks.cpp
index e0c91d0..c053fad 100644
--- a/runtime/NeuralNetworks.cpp
+++ b/runtime/NeuralNetworks.cpp
@@ -32,6 +32,8 @@
 #include "Tracing.h"
 #include "Utils.h"
 
+#include "vndk/hardware_buffer.h"
+
 #include <cstddef>
 #include <memory>
 #include <vector>
@@ -546,6 +548,22 @@
     return ANEURALNETWORKS_NO_ERROR;
 }
 
+int ANeuralNetworksMemory_createFromAHardwareBuffer(const AHardwareBuffer* ahwb,
+                                                    ANeuralNetworksMemory** memory) {
+    NNTRACE_RT(NNTRACE_PHASE_PREPARATION, "ANeuralNetworksMemory_createFromAHardwareBuffer");
+    *memory = nullptr;
+    std::unique_ptr<MemoryAHWB> m = std::make_unique<MemoryAHWB>();
+    if (m == nullptr) {
+        return ANEURALNETWORKS_OUT_OF_MEMORY;
+    }
+    int n = m->set(ahwb);
+    if (n != ANEURALNETWORKS_NO_ERROR) {
+        return n;
+    }
+    *memory = reinterpret_cast<ANeuralNetworksMemory*>(m.release());
+    return ANEURALNETWORKS_NO_ERROR;
+}
+
 void ANeuralNetworksMemory_free(ANeuralNetworksMemory* memory) {
     NNTRACE_RT(NNTRACE_PHASE_TERMINATION, "ANeuralNetworksMemory_free");
     // No validation.  Free of nullptr is valid.