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
- Recompile the offending class from source with a modern JDK (Java 6+) so jsr/ret is replaced by inlined finally blocks
- Run the jar through an ASM-based ClassRemapper/jsr-inlining pass (ASM's JSRInlinerAdapter) before feeding it to dex-translator
- 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
- Compile input code with Java 6+ so jsr/ret is never emitted
- Run ASM JSRInlinerAdapter over legacy jars before conversion
- Watch for pre-2005 third-party libraries in dependency trees
- Keep class-file versions >= 50 in build configuration
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
- Invalid array type
- stack not balanced
- cant find zipfs support
- while accept code in method
- zero-width instruction op=0x%02x
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)