IVGCVSW-3595 Implement the LoadDynamicBackends function in the Runtime class

 * Changed the way the handle is acquired, loaded symbols are now kept local
 * Updated the makefiles to add more test files for the dynamic backends
 * Fixed the GetSharedObjects method so that the files are parsed in
   alphabetical order
 * Updated the unit tests to make them more strict wrt the order of the
   files
 * Created a new CreateDynamicBackends method in the utils class
 * Added new unit tests for the new function
 * Added LoadDynamicBackends in the Runtime class

!android-nn-driver:1707

Change-Id: I1ef9ff3d5455ca6a7fd51cb7cfb3819686234f70
Signed-off-by: Matteo Martincigh <matteo.martincigh@arm.com>
diff --git a/src/armnn/Runtime.cpp b/src/armnn/Runtime.cpp
index f8b2462..3505030 100644
--- a/src/armnn/Runtime.cpp
+++ b/src/armnn/Runtime.cpp
@@ -5,8 +5,11 @@
 #include "Runtime.hpp"
 
 #include <armnn/Version.hpp>
+
 #include <backendsCommon/BackendRegistry.hpp>
 #include <backendsCommon/IBackendContext.hpp>
+#include <backendsCommon/DynamicBackendUtils.hpp>
+#include <backendsCommon/DynamicBackend.hpp>
 
 #include <iostream>
 
@@ -134,6 +137,10 @@
 {
     BOOST_LOG_TRIVIAL(info) << "ArmNN v" << ARMNN_VERSION << "\n";
 
+    // Load any available/compatible dynamic backend before the runtime
+    // goes through the backend registry
+    LoadDynamicBackends(options.m_DynamicBackendsPath);
+
     for (const auto& id : BackendRegistryInstance().GetBackendIds())
     {
         // Store backend contexts for the supported ones
@@ -237,4 +244,16 @@
     loadedNetwork->RegisterDebugCallback(func);
 }
 
+void Runtime::LoadDynamicBackends(const std::string& overrideBackendPath)
+{
+    // Get the paths where to load the dynamic backends from
+    std::vector<std::string> backendPaths = DynamicBackendUtils::GetBackendPaths(overrideBackendPath);
+
+    // Get the shared objects to try to load as dynamic backends
+    std::vector<std::string> sharedObjects = DynamicBackendUtils::GetSharedObjects(backendPaths);
+
+    // Create a list of dynamic backends
+    DynamicBackendUtils::CreateDynamicBackends(sharedObjects);
 }
+
+} // namespace armnn