10e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilson/* 20e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilson * Copyright (C) 2012 The Android Open Source Project 30e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilson * 40e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilson * Licensed under the Apache License, Version 2.0 (the "License"); 50e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilson * you may not use this file except in compliance with the License. 60e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilson * You may obtain a copy of the License at 70e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilson * 80e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilson * http://www.apache.org/licenses/LICENSE-2.0 90e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilson * 100e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilson * Unless required by applicable law or agreed to in writing, software 110e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilson * distributed under the License is distributed on an "AS IS" BASIS, 120e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilson * See the License for the specific language governing permissions and 140e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilson * limitations under the License. 150e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilson */ 160e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilson 17b8a5896885d4da2b798888b688a46df1adbf5b89Paul Duffinpackage com.android.dx.examples; 18b8a5896885d4da2b798888b688a46df1adbf5b89Paul Duffin 19b8a5896885d4da2b798888b688a46df1adbf5b89Paul Duffinimport com.android.dx.Code; 20b8a5896885d4da2b798888b688a46df1adbf5b89Paul Duffinimport com.android.dx.Comparison; 21b8a5896885d4da2b798888b688a46df1adbf5b89Paul Duffinimport com.android.dx.DexMaker; 22b8a5896885d4da2b798888b688a46df1adbf5b89Paul Duffinimport com.android.dx.Label; 23b8a5896885d4da2b798888b688a46df1adbf5b89Paul Duffinimport com.android.dx.Local; 24b8a5896885d4da2b798888b688a46df1adbf5b89Paul Duffinimport com.android.dx.MethodId; 25b8a5896885d4da2b798888b688a46df1adbf5b89Paul Duffinimport com.android.dx.TypeId; 26b8a5896885d4da2b798888b688a46df1adbf5b89Paul Duffinimport com.android.dx.BinaryOp; 270e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilson 280e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilsonimport java.io.File; 290e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilsonimport java.lang.reflect.Method; 300e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilsonimport java.lang.reflect.Modifier; 310e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilson 320e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilsonpublic final class FibonacciMaker { 330e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilson public static void main(String[] args) throws Exception { 340e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilson TypeId<?> fibonacci = TypeId.get("Lcom/google/dexmaker/examples/Fibonacci;"); 355692b3b0303c55524ff206dc7840ffdb1fa47628Jesse Wilson 360e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilson String fileName = "Fibonacci.generated"; 375692b3b0303c55524ff206dc7840ffdb1fa47628Jesse Wilson DexMaker dexMaker = new DexMaker(); 380e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilson dexMaker.declare(fibonacci, fileName, Modifier.PUBLIC, TypeId.OBJECT); 390e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilson 400e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilson MethodId<?, Integer> fib = fibonacci.getMethod(TypeId.INT, "fib", TypeId.INT); 410e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilson Code code = dexMaker.declare(fib, Modifier.PUBLIC | Modifier.STATIC); 425692b3b0303c55524ff206dc7840ffdb1fa47628Jesse Wilson 430e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilson Local<Integer> i = code.getParameter(0, TypeId.INT); 440e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilson Local<Integer> constant1 = code.newLocal(TypeId.INT); 450e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilson Local<Integer> constant2 = code.newLocal(TypeId.INT); 460e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilson Local<Integer> a = code.newLocal(TypeId.INT); 470e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilson Local<Integer> b = code.newLocal(TypeId.INT); 480e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilson Local<Integer> c = code.newLocal(TypeId.INT); 490e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilson Local<Integer> d = code.newLocal(TypeId.INT); 500e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilson Local<Integer> result = code.newLocal(TypeId.INT); 515692b3b0303c55524ff206dc7840ffdb1fa47628Jesse Wilson 520e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilson code.loadConstant(constant1, 1); 530e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilson code.loadConstant(constant2, 2); 5423abc2fe89ec3713645d64bdb74415a9090084f4Jesse Wilson Label baseCase = new Label(); 550e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilson code.compare(Comparison.LT, baseCase, i, constant2); 560e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilson code.op(BinaryOp.SUBTRACT, a, i, constant1); 570e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilson code.op(BinaryOp.SUBTRACT, b, i, constant2); 580e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilson code.invokeStatic(fib, c, a); 590e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilson code.invokeStatic(fib, d, b); 600e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilson code.op(BinaryOp.ADD, result, c, d); 610e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilson code.returnValue(result); 620e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilson code.mark(baseCase); 630e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilson code.returnValue(i); 640e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilson 650e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilson ClassLoader loader = dexMaker.generateAndLoad( 66ff314e1f06b974be78de3356a71072dbf0a450cdJesse Wilson FibonacciMaker.class.getClassLoader(), getDataDirectory()); 675692b3b0303c55524ff206dc7840ffdb1fa47628Jesse Wilson 680e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilson Class<?> fibonacciClass = loader.loadClass("com.google.dexmaker.examples.Fibonacci"); 690e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilson Method fibMethod = fibonacciClass.getMethod("fib", int.class); 700e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilson System.out.println(fibMethod.invoke(null, 8)); 710e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilson } 720e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilson 737ff2c5291c7e0840ef62842372df0c2ecd5979f4Andrew Yousef public static File getDataDirectory() { 747ff2c5291c7e0840ef62842372df0c2ecd5979f4Andrew Yousef String envVariable = "ANDROID_DATA"; 757ff2c5291c7e0840ef62842372df0c2ecd5979f4Andrew Yousef String defaultLoc = "/data"; 767ff2c5291c7e0840ef62842372df0c2ecd5979f4Andrew Yousef String path = System.getenv(envVariable); 777ff2c5291c7e0840ef62842372df0c2ecd5979f4Andrew Yousef return path == null ? new File(defaultLoc) : new File(path); 780e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilson } 790e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilson} 80