internal NativePluginRunner(
            string apiKey,
            TextureLoadHandler textureLoadHandler,
            MaterialRepository materialRepository,
            MapGameObjectScene mapGameObjectScene,
            ConfigParams config,
            IndoorMapScene indoorMapScene,
            IndoorMapsApiInternal indoorMapsApiInternal,
            IndoorMapMaterialService indoorMapMaterialService,
            LabelServiceInternal labelServiceInternal,
            PositionerApiInternal positionerApiInternal,
            CameraApiInternal cameraApiInternal,
            BuildingsApiInternal buildingsApiInternal,
            PrecacheApiInternal precacheApiInternal)
        {
            m_threadService      = new ThreadService();
            m_textureLoadHandler = textureLoadHandler;
            m_materialRepository = materialRepository;
            m_mapGameObjectScene = mapGameObjectScene;
            m_streamingUpdater   = new StreamingUpdater();

            var nativeConfig = config.GetNativeConfig();
            var pathString   = GetStreamingAssetsDir();
            var pathBytes    = GetNullTerminatedUTF8Bytes(pathString);

            var indoorMapsApiHandle            = indoorMapsApiInternal.GetHandle();
            var indoorMapMaterialServiceHandle = indoorMapMaterialService.GetHandle();

            var apiCallbacks = new ApiCallbacks(
                indoorMapsApiHandle,
                indoorMapMaterialServiceHandle,
                indoorMapScene.GetHandle(),
                cameraApiInternal.GetHandle(),
                buildingsApiInternal.GetHandle(),
                m_threadService.GetHandle(),
                textureLoadHandler.GetHandle(),
                mapGameObjectScene.GetHandle(),
                labelServiceInternal.GetHandle(),
                positionerApiInternal.GetHandle(),
                precacheApiInternal.GetHandle());

            Initialize(Screen.width, Screen.height, Screen.dpi,
                       apiKey,
                       pathBytes,
                       ref nativeConfig,
                       ref apiCallbacks,
                       config.CoverageTreeManifestUrl,
                       config.ThemeManifestUrl
                       );

            API = GetAppInterface();
            Debug.Assert(API != IntPtr.Zero);

            m_isRunning = true;
        }