一.函數調用
- smali中的函數和成員變量也分為兩種,分別為 direct 和 virtual
兩者的區別
1.direct method 是指private函數
2.virtual method 是指 protected和 public 函數
3.所以在調用函數時,有invoke-direct,invoke-virtual,另外還有invoke-static、invoke-super以及invoke-interface等幾種不同的指令。
4.當然其實還有invoke-XXX/range 指令的,這是參數多於4個的時候調用的指令,比較少見
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字符串