Add support for mmaped file descriptor

  - create new API to create ANeuralNetworks_Memory from a mmaped fd.
  - add the corresponding Memory constructor to NeuralNetworksWrapper.h
  - Add unit test TestFd for the new API.

Bug: 63905942
Test: mm
Test: TestFd pass with CPU path.
Test: TestFd pass on sample HIDL driver, with ag/2588539

Change-Id: I1fcb0f0bd01e58bd592e18eff11c27034ee4a4c3
diff --git a/runtime/NeuralNetworks.cpp b/runtime/NeuralNetworks.cpp
index 47535f8..2257dee 100644
--- a/runtime/NeuralNetworks.cpp
+++ b/runtime/NeuralNetworks.cpp
@@ -291,37 +291,18 @@
     return ANEURALNETWORKS_NO_ERROR;
 }
 
-/* TODO
-int ANeuralNetworksMemory_createFromHidlMemory(hidl_memory hidlMemory,
-                                               ANeuralNetworksMemory** memory) {
-    if (!memory) {
-        LOG(ERROR) << "ANeuralNetworksMemory_createFromHidlMemory passed a nullptr";
-        return ANEURALNETWORKS_UNEXPECTED_NULL;
-    }
-    *memory = nullptr;
-    std::unique_ptr<Memory> m = std::make_unique<Memory>(Memory());
-    if (m == nullptr) {
-        return ANEURALNETWORKS_OUT_OF_MEMORY;
-    }
-    int n = m->setFromHidlMemory(hidlMemory);
-    if (n != ANEURALNETWORKS_NO_ERROR) {
-        return n;
-    }
-    *memory = reinterpret_cast<ANeuralNetworksMemory*>(m.release());
-    return ANEURALNETWORKS_NO_ERROR;
-}
-
-int ANeuralNetworksMemory_createFromFd(int fd, ANeuralNetworksMemory** memory) {
+int ANeuralNetworksMemory_createFromFd(size_t size, int prot, int fd,
+                                       ANeuralNetworksMemory** memory) {
     if (fd < 0) {
         LOG(ERROR) << "ANeuralNetworksMemory_createFromFd invalid fd " << fd;
         return ANEURALNETWORKS_UNEXPECTED_NULL;
     }
     *memory = nullptr;
-    std::unique_ptr<Memory> m = std::make_unique<Memory>(Memory());
+    std::unique_ptr<MemoryFd> m = std::make_unique<MemoryFd>();
     if (m == nullptr) {
         return ANEURALNETWORKS_OUT_OF_MEMORY;
     }
-    int n = m->setFromFd(fd);
+    int n = m->set(size, prot, fd);
     if (n != ANEURALNETWORKS_NO_ERROR) {
         return n;
     }
@@ -329,21 +310,6 @@
     return ANEURALNETWORKS_NO_ERROR;
 }
 
-int ANeuralNetworksMemory_createFromGrallocBuffer(buffer_handle_t buffer,
-                                                  ANeuralNetworksMemory** memory) {
-    *memory = nullptr;
-    // TODO implement
-    return ANEURALNETWORKS_NO_ERROR;
-}
-
-int ANeuralNetworksMemory_createFromHardwareBuffer(AHardwareBuffer* buffer,
-                                                   ANeuralNetworksMemory** memory) {
-    *memory = nullptr;
-    // TODO implement
-    return ANEURALNETWORKS_NO_ERROR;
-}
-*/
-
 int ANeuralNetworksMemory_getPointer(ANeuralNetworksMemory* memory, uint8_t** buffer) {
     if (!memory || !buffer) {
         LOG(ERROR) << "ANeuralNetworksMemory_getPointer passed a nullptr";