/** Private constructor for this class. */
  private LibDexLoader() {
    String assetDexName = "jitsi-bundles-dex.jar";
    // Before the dex file can be processed by the DexClassLoader,
    // it has to be first copied from asset resource to a storage location.
    Context ctx = JitsiApplication.getGlobalContext();
    File dexInternalStoragePath = new File(ctx.getDir("dex", Context.MODE_PRIVATE), assetDexName);

    BufferedInputStream bis = null;
    OutputStream dexWriter = null;

    final int BUF_SIZE = 2 * 1024;
    try {
      bis = new BufferedInputStream(ctx.getAssets().open(assetDexName));
      dexWriter = new BufferedOutputStream(new FileOutputStream(dexInternalStoragePath));
      byte[] buf = new byte[BUF_SIZE];
      int len;
      while ((len = bis.read(buf, 0, BUF_SIZE)) > 0) {
        dexWriter.write(buf, 0, len);
      }
      dexWriter.close();
      bis.close();

      // Internal storage where the DexClassLoader writes
      // the optimized dex file to
      final File optimizedDexOutputPath = ctx.getDir("outdex", Context.MODE_PRIVATE);

      this.dexClassLoader =
          new DexClassLoader(
              dexInternalStoragePath.getAbsolutePath(),
              optimizedDexOutputPath.getAbsolutePath(),
              null,
              getClass().getClassLoader());
    } catch (Exception e) {
      throw new RuntimeException(e);
    }
  }