1. 程式人生 > >Java位元組碼和Dalvik位元組碼

Java位元組碼和Dalvik位元組碼

public class Hello {
public int foo (int a,int b){
return (a+b)*(a-b);
}

public static void main(String args[]){
Hello hello = new Hello();
System.out.print(hello.foo(5,3));
}


}

將以上內容儲存為Hello.java 

開啟cmd 執行命令 javac Hello.java (1.6版本的)

 Javac -sourse 1.6 -target 1.6 Hello.java(要編譯的檔案) 高版本比如1.7.8的強制為1.6

接下來用Javap -c -classpath . Hello 

命令執行後得到如下程式碼

  public int foo(int, int);
    Code:
       0: iload_1
       1: iload_2
       2: iadd
       3: iload_1
       4: iload_2
       5: isub
       6: imul
       7: ireturn

執行dx --dex --output=Hello.dex Hello.class 生成dex檔案 (dx位於Android SDK的platform-tools目錄中,生成的.dex也在這個資料夾裡)

使用dx工具編譯Hello.class

時,如提示無法找到Hello.classHello.class檔案與dx放同一目錄後重新編譯

使用dexdump.exe 檢視foo()函式的Dalvik位元組碼

dexdump.exe -d Hello.dex (記得把Hello.dex移到你當前資料夾,或者你去配置路徑也行)


Hello.foo:(II)I
0000: add-int v0, v3, v4
0002: sub-int v1, v3, v4
0004: mul-int/2addr v0, v1
0005: return v0
這個是編譯時沒有定義1.6版本的報錯,強制編譯1.6就行了
C:\Users\Administrator>dx --dex --output=Hello.dex Hello.calss

UNEXPECTED TOP-LEVEL EXCEPTION:
java.lang.RuntimeException: Hello.calss: file not found
        at com.android.dx.util.FileUtils.readFile(FileUtils.java:55)
        at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.j
ava:134)
        at com.android.dx.cf.direct.ClassPathOpener.process(ClassPathOpener.java
:109)
        at com.android.dx.command.dexer.Main.processOne(Main.java:422)
        at com.android.dx.command.dexer.Main.processAllFiles(Main.java:333)
        at com.android.dx.command.dexer.Main.run(Main.java:209)
        at com.android.dx.command.dexer.Main.main(Main.java:174)
        at com.android.dx.command.Main.main(Main.java:91)
1 error; aborting

上面的JAVA位元組碼,foo()函式一共佔用了8個位元組,程式碼中每條指令佔用一行