一.函数调用
smali中的函数和成员变量也分为两种,分别为 direct 和 virtual。两者的区别如下:
1.direct method 是指调用private方法。
2.virtual method 是指调用protected和public方法。
3.static method 是指调用static方法。
4.super method是指调用父类方法。
5.当然其实还有invoke-XXX/range指令的,这是参数多于4个的时候调用的指令,比较少见。
所以在调用函数时,有invoke-direct,invoke-virtual,另外还有invoke-static、invoke-super以及invoke-interface等几种不同的指令。
下面针对这几种函数调用的smali方法进行讲解。
1.invoke-static
用于调用static函数,例如:
invoke-static
{}
, Lcom/aaa;->CheckSignature()
Z
注意:
invoke-static后面有一对大括号“{}”,其实是调用该方法的实例+参数列表,由于这个方法既不需参数也是static的,所以{}内为空。
const-string v0
, "NDKLIB"
invoke-static
{
v0
}, Ljava/lang/System;->loadLibrary(Ljava/lang/String;)
V
这个是调用
static void
System.loadLibrary(
String
)来加载NDK编译的so库用的方法
2.invoke-super
调用父类方法用的指令,一般用于调用onCreate、onDestroy等方法。
3.invoke-direct
调用private函数:
invoke-direct {p0}, Landroid/app/TabActivity;-><init>()V
这里init()就是定义在TabActivity中的一个
private函数。
4.invoke-virtual
用于调用protected或public函数,同样注意修改smali时不要错用invoke-direct或invoke-static。
5.invoke-xxxxx/range
当方法的参数多于5个时(含5个),不能直接使用以上的指令,而是在后面加上“/range”,range表示范围,使用方法也有所不同。
二.函数的返回结果
在Java代码中调用函数和返回函数结果可以用一条语句完成,而在Smali里则需要分开来完成,在使用上述指令后,如果调用的函数返回非void,那么还需要用到move-result(返回基本数据类型)和move-result-object(返回对象)指令:
const-string
v0
, "Eric"
invoke-static
{
v0
}, Lcmb/pbi;->t(Ljava/lang/String;)Ljava/lang/String;
move-result-object
v2
上述中的v2寄存器保存的就是调用t方法返回的String字符串。
Toast
.
makeText
(
this
,
"Hello, Smali"
,
Toast
.
LENGTH_LONG
).
show
();
.line xx
const-string
v0, "Hello, Smali"
const/4
v1
, 0x1
invoke-static
{p0, v0, v1}, Landroid/widget/Toast;->makeText(Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast;
move-result-object
v0
invoke-virtual
{v0}, Landroid/widget/Toast;->show()V