private ByteProvider getJarFile(FSRL jarFSRL, TaskMonitor monitor)
			throws CancelledException, IOException {
		TaskMonitor upwtm = new UnknownProgressWrappingTaskMonitor(monitor, 1);
		upwtm.setMessage("Converting DEX to JAR...");

		FSRLRoot targetFSRL = getFSRL();
		FSRL containerFSRL = targetFSRL.getContainer();

		ByteProvider jarBP = fsService.getDerivedByteProviderPush(containerFSRL, jarFSRL,
			"dex2jar", -1, (os) -> {
				try (ZipOutputStream outputStream = new ZipOutputStream(os)) {

					DexToJarExceptionHandler exceptionHandler = new DexToJarExceptionHandler();

					byte[] containerFileBytes = provider.readBytes(0, provider.length());
					DexFileReader reader = new DexFileReader(containerFileBytes);

					DexFileNode fileNode = new DexFileNode();
					try {
						reader.accept(fileNode, DexFileReader.IGNORE_READ_EXCEPTION);
					}
					catch (Exception ex) {
						exceptionHandler.handleFileException(ex);
					}

					DexFileVisitor visitor = new DexFileVisitor();
					reader.accept(visitor);

					ClassVisitorFactory classVisitorFactory = name -> new ClassVisitor(Opcodes.ASM4,
						new ClassWriter(ClassWriter.COMPUTE_MAXS)) {
						//NOTE: EXTRACTED FROM Dex2jar.java
						@Override
						public void visitEnd() {
							super.visitEnd();
							ClassWriter cw = (ClassWriter) super.cv;

							byte[] data;
							try {
								// FIXME handle 'java.lang.RuntimeException: Method code too large!'
								data = cw.toByteArray();
							}
							catch (Exception ex) {
								//System.err.println(String.format("ASM fail to generate .class file: %s", name));
								Msg.warn(this,
									String.format("ASM fail to generate .class file: %s", name));
								exceptionHandler.handleFileException(ex);
								return;
							}
							try {
								ZipEntry entry = new ZipEntry(name + ".class");
								outputStream.putNextEntry(entry);
								outputStream.write(data);
								outputStream.closeEntry();
								upwtm.incrementProgress(1);

							}
							catch (IOException e) {
								//e.printStackTrace(System.err);
								Msg.warn(this, e);
							}
						}
					};

					ExDex2Asm exDex2Asm = new ExDex2Asm(exceptionHandler);
					exDex2Asm.convertDex(fileNode, classVisitorFactory);

					if (exceptionHandler.getFileException() != null) {
						throw new IOException(exceptionHandler.getFileException());
					}

					outputStream.finish();
				}

			}, monitor);

		return jarBP;
	}
{@link GFileSystem} that converts a DEX file into a JAR file.
Ghidra/Features/FileFormats/src/main/java/ghidra/file/formats/android/dex/DexToJarFileSystem.java