/** 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); } }