|
32 | 32 | import external.com.android.dx.rop.cst.CstType;
|
33 | 33 | import external.com.android.dx.rop.type.StdTypeList;
|
34 | 34 |
|
| 35 | +import java.io.BufferedOutputStream; |
35 | 36 | import java.io.File;
|
36 | 37 | import java.io.FileOutputStream;
|
37 | 38 | import java.io.IOException;
|
|
46 | 47 | import java.util.jar.JarOutputStream;
|
47 | 48 |
|
48 | 49 | import static external.com.android.dx.rop.code.AccessFlags.ACC_CONSTRUCTOR;
|
49 |
| -import static java.lang.reflect.Modifier.PRIVATE; |
50 |
| -import static java.lang.reflect.Modifier.STATIC; |
| 50 | +import static java.lang.reflect.Modifier.*; |
51 | 51 |
|
52 | 52 | /**
|
53 | 53 | * Generates a <strong>D</strong>alvik <strong>EX</strong>ecutable (dex)
|
@@ -265,8 +265,8 @@ public Code declare(MethodId<?, ?> method, int flags) {
|
265 | 265 | throw new IllegalStateException("already declared: " + method);
|
266 | 266 | }
|
267 | 267 |
|
268 |
| - int supportedFlags = Modifier.PUBLIC | Modifier.PRIVATE | Modifier.PROTECTED |
269 |
| - | Modifier.STATIC | Modifier.FINAL | Modifier.SYNCHRONIZED |
| 268 | + int supportedFlags = Modifier.ABSTRACT | Modifier.NATIVE | Modifier.PUBLIC | Modifier.PRIVATE |
| 269 | + | Modifier.PROTECTED | Modifier.STATIC | Modifier.FINAL | Modifier.SYNCHRONIZED | Modifier.TRANSIENT |
270 | 270 | | AccessFlags.ACC_SYNTHETIC | AccessFlags.ACC_BRIDGE;
|
271 | 271 | if ((flags & ~supportedFlags) != 0) {
|
272 | 272 | throw new IllegalArgumentException("Unexpected flag: "
|
@@ -558,14 +558,22 @@ public ClassLoader generateAndLoad(ClassLoader parent, File dexCache, String dex
|
558 | 558 |
|
559 | 559 | result.createNewFile();
|
560 | 560 |
|
561 |
| - JarOutputStream jarOut = new JarOutputStream(new FileOutputStream(result)); |
562 |
| - JarEntry entry = new JarEntry(DexFormat.DEX_IN_JAR_NAME); |
563 |
| - byte[] dex = generate(); |
564 |
| - entry.setSize(dex.length); |
565 |
| - jarOut.putNextEntry(entry); |
566 |
| - jarOut.write(dex); |
567 |
| - jarOut.closeEntry(); |
568 |
| - jarOut.close(); |
| 561 | + JarOutputStream jarOut = |
| 562 | + new JarOutputStream(new BufferedOutputStream(new FileOutputStream(result))); |
| 563 | + try { |
| 564 | + JarEntry entry = new JarEntry(DexFormat.DEX_IN_JAR_NAME); |
| 565 | + byte[] dex = generate(); |
| 566 | + entry.setSize(dex.length); |
| 567 | + jarOut.putNextEntry(entry); |
| 568 | + try { |
| 569 | + jarOut.write(dex); |
| 570 | + } finally { |
| 571 | + jarOut.closeEntry(); |
| 572 | + } |
| 573 | + } finally { |
| 574 | + jarOut.close(); |
| 575 | + } |
| 576 | + |
569 | 577 | return generateClassLoader(result, dexCache, parent);
|
570 | 578 | }
|
571 | 579 |
|
@@ -702,6 +710,10 @@ boolean isDirect() {
|
702 | 710 | }
|
703 | 711 |
|
704 | 712 | EncodedMethod toEncodedMethod(DexOptions dexOptions) {
|
| 713 | + if ((flags & ABSTRACT) != 0 || (flags & NATIVE) != 0) { |
| 714 | + return new EncodedMethod(method.constant, flags, null, StdTypeList.EMPTY); |
| 715 | + } |
| 716 | + |
705 | 717 | RopMethod ropMethod = new RopMethod(code.toBasicBlocks(), 0);
|
706 | 718 | LocalVariableInfo locals = null;
|
707 | 719 | DalvCode dalvCode = RopTranslator.translate(
|
|
0 commit comments