pxb1988/dex2jar · error · RuntimeException

not support yet!

Error message

not support yet!

What it means

Thrown from J2IRConverter.JvmFrame.execute() when the analyzer encounters the JVM RET opcode during Java-to-IR conversion. RET (return from subroutine, used by pre-1.0 javac with the old jsr/ret try-finally pattern) is not modeled by the converter, so it refuses to continue rather than produce an incorrect IR.

Solutions

  1. Recompile the offending class from source with a modern JDK (Java 6+) so jsr/ret is replaced by inlined finally blocks
  2. Run the jar through an ASM-based ClassRemapper/jsr-inlining pass (ASM's JSRInlinerAdapter) before feeding it to dex-translator
  3. Upgrade the class files (e.g. re-target bytecode version >= 50) to eliminate subroutines

Example fix

// before: direct conversion of legacy class
ClassReader cr = new ClassReader(bytes); cr.accept(converter, 0);
// after: inline jsr/ret with ASM first
ClassReader cr = new ClassReader(bytes);
ClassWriter cw = new ClassWriter(cr, 0);
cr.accept(new JSRInlinerAdapter(cw, access, name, desc, signature, exceptions), 0);
byte[] inlined = cw.toByteArray();
Defensive patterns

Strategy: validation

Validate before calling

// Scan class files for JSR/RET before conversion
for (MethodNode m : classNode.methods)
    for (AbstractInsnNode i : m.instructions)
        if (i.getOpcode() == Opcodes.JSR || i.getOpcode() == Opcodes.RET)
            throw new IllegalStateException("legacy jsr/ret: inline first");

Try / catch

try {
    dexTranslator.convert(inJar, outDex);
} catch (RuntimeException e) {
    if ("not support yet!".equals(e.getMessage())) {
        bytes = inlineJsrRetWithAsm(bytes); // JSRInlinerAdapter, then retry
    } else throw e;
}

Prevention

When it happens

Trigger: Converting a class file whose bytecode contains JSR/RET subroutine instructions — only produced by very old compilers (pre-Java 6 style try/finally) or hand-assembled code; modern javac inlines finally blocks and never emits RET.

Common situations: Translating legacy libraries compiled with ancient javac versions, or deobfuscating old Android-era jars that still contain jsr/ret, in jar-to-dex conversion.

Understand the failure class

Background: UnsupportedOperationException and "is not supported" errors: when a library deliberately refuses a call — this error's family across 30 libraries.

Related errors


AI-assisted analysis of pxb1988/dex2jar@b5bda4fb49 (2026-09-08). Data as JSON: /api/errors/fd35cf95b91b2824. Report an issue: GitHub.

Appendix: source

Thrown at dex-translator/src/main/java/com/googlecode/d2j/converter/J2IRConverter.java:987

    }

    static class JvmFrame extends Frame<JvmValue> {

        public JvmFrame(int nLocals, int nStack) {
            super(nLocals, nStack);
        }

        @Override
        public void execute(AbstractInsnNode insn, Interpreter<JvmValue> interpreter) throws AnalyzerException {
            if (insn.getType() == AbstractInsnNode.FRAME || insn.getType() == AbstractInsnNode.LINE || insn.getType() == AbstractInsnNode.LABEL) {
                return;
            }
            if (insn.getOpcode() == Opcodes.RETURN) {
                interpreter.returnOperation(insn, null, null);
            } else if (insn.getOpcode() == Opcodes.GOTO) {
                interpreter.unaryOperation(insn, null);
            } else if (insn.getOpcode() == RET) {
                throw new RuntimeException("not support yet!");
            } else {
                super.execute(insn, interpreter);
            }
        }
    }

    public static class JvmValue implements Value {
        private final int size;
        public JvmValue parent;
        public Set<JvmValue> otherParent;
        Local local;

        public JvmValue(int size, Local local) {
            this.size = size;
            this.local = local;
        }

        public JvmValue(int size) {

View on GitHub (pinned to b5bda4fb49)