smali的 HelloWorld

这一篇文章是smali的入门教程

打开 notepad++ (怎样识别smali语法在另一片文章里介绍)

输入以下代码 : 

.class public LHelloWorld;
.super Ljava/lang/Object;
.method public static main([Ljava/lang/String;)V
    .registers 2
    sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream;
    const-string v1, "Hello World!"
    invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V
    return-void
.end method

 java -jar smali.jar -o classes.dex HelloWorld.smali (关于smali的介绍在另一片文章里有)

zip HelloWorld.zip classes.dex

adb push HelloWorld.zip /sdcard/

adb shell dalvikvm -cp /adcard/HelloWorld.zip HelloWorld

代码解释:

.class public LHelloWorld; 

定义一个 HelloWorld 类 L在java 里表示reference 类型

.super Ljava/lang/Object;

继承了Object 类,写java 代码时一般不需要显示的定义,但在.class .dex 或者smali编程时都是显示的表示(不要觉的麻烦,去适应它)

.method public static main([Ljava/lang/String;)V

V 表示返回值是void, [表示一个数组, 那么在这里是String数组, 

.registers 2 申请2个 virtual registers

sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream;

把System类里的 out变量赋值给v0, 相当于System.out

const-string v1, "Hello World!"

给v1赋值 Hello World! 字符串 , 相当于 a = "Hello World!"

invoke-virtual {v0, v1} ,LJava/io/PrintStream;->println(Ljava/lang/String;)V

调用println()方法, v0 是 System.out, v1是“Hello WOrld!” 作为 println的第一个参数,记住指令集的第2个参数就是对应方法的第一个参数,以此类推。相当于 System.out.println("Hello World!");

原文 : http://code.google.com/p/smali/source/browse/examples/HelloWorld/HelloWorld.smali

猜你喜欢

转载自qianbin127.iteye.com/blog/1729639