一.函数调用
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

(1)Smali系列学习之Smali函数调用语句分析的更多相关文章

  1. (2.0)Smali系列学习之Smali语法

    一.smali的包中信息 .class  public Lcom/aaaaa;.super  Lcom/bbbbb;.source "ccccc.java" 1.它是com.aaa ...

  2. (4)Smali系列学习之Smali语法详解内部类

    在这一节,我们来介绍一下内部类.对于Java文件中的每一个内部类,都会产生一个单独的smali文件,比如ActivityThread$1.smali.这些文件的命名规范是如果是匿名内部类,则命名规则是 ...

  3. (3)Smali系列学习之Smali语法详解

    数据类型 Dalvik字节码只有两种格式:基本类型和引用类型.对象和数组属于引用类型 语法 含义 V void,只用于返回值类型 Z boolean B byte S short C char I i ...

  4. tsql语句分析工具 转

    一款好用且免费的语句分析工具 在调优过程中的查询语句优化阶段,分析语句的执行计划是必经之路,一款好的执行计划分析工具确实可以帮助我们事半功倍 一款名为“Plan Explorer“,自己用的挺爽,不私 ...

  5. sqlserver 抓取所有执行语句 SQL语句分析 死锁 抓取

    原文:sqlserver 抓取所有执行语句 SQL语句分析 死锁 抓取 在多人开发中最头疼的是人少事多没有时间进行codereview,本来功能都没时间写,哪有时间来开会细细来分析代码.软件能跑就行, ...

  6. MongoDB分析工具之一:explain()语句分析工具

    explain(),语句分析工具 MongoDB 3.0之后,explain的返回与使用方法与之前版本有了很大的变化,介于3.0之后的优秀特色和我们目前所使用给的是3.0.7版本,本文仅针对Mongo ...

  7. Lucene中Analyzer语句分析

    Lucene中Analyzer语句分析,利用lucene中自带的词法分析工具Analyzer,进行对句子的分析. 源代码如下: package com.test; import java.io.IOE ...

  8. (2.1)Smali系列学习之基础语法

    一.什么是Smali?Smali,Baksmali分别是指安卓系统里的Java虚拟机(Dalvik)所使用的一种dex格式文件的汇编器,反汇编器.其语法是一种宽松式的Jasmin/dedexer语法, ...

  9. smali 语法之try catch语句

    # virtual methods .method public onClick(Landroid/view/View;)V .locals 4 .parameter "v" .p ...

随机推荐

  1. 高手从零开始的全定制发行版-Linux from Scratch

    在制作Linux发行版中Linux from Scratch可谓是真正的大师级.Linux from Scratch是在线的社区创建的一本电子书,目的是帮助那些根深蒂固的想方设法提高计算机性能的人(t ...

  2. python接口自动化21-规范的API接口文档示例

    前言 接口文档到底长啥样?做接口测试最大的障碍在于没有接口文档,很多公司不注重接口文档的编写,导致测试小伙伴没见过接口文档. 运气好一点的测试小伙伴可能厚着脸皮找开发要过接口文档,然而拿过来的接口文档 ...

  3. 动态jdk启动项目

    昨天遇到,服务器安装jdk1.7,但是springboot项目用jdk1.8编译的,所以需要指定jdk版本启动: nohup /root/jdk1.8.0_11/bin/java -jar /root ...

  4. 十二.spring-boot使用spring-boot-freemarker

    ①.在springMVC中:它代表着view层组件 ②.为什么使用freemarker:简单容易学.逻辑分明 ③.freemarker优点:它不依赖servlet.网络或者web环境 一.创建一个ma ...

  5. Javascript时间字符串比较

    //startdate和enddate的格式为:yyyy-MM-dd hh:mm:ss //当date1在date2之前时,返回1;当date1在date2之后时,返回-1:相等时,返回0 funct ...

  6. Java程序猿笔试面试之String

    1.怎样实现字符串的反转比如:"how are you"--->"you are how" 2.怎样推断2个字符串是否有同样的字符组成 比如"a ...

  7. [转]SQLServer和Oracle,存储过程区别,常用函数对比

    本文转自:http://www.cnblogs.com/neru/archive/2011/08/18/2144049.html 以前一直用sqlserver,只有很少的一点oracle的经验,现在要 ...

  8. Qunit的使用

    1.新建一个html页面,如下 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "ht ...

  9. shader cycles静态分析

    mali Mali Offline Compiler https://developer.arm.com/products/software-development-tools/graphics-de ...

  10. Hadoop 伪分布式上安装 Hive

    下载地址:点此链接(P.S.下载带bin的安装包) 下载hive后放到虚拟机文件夹内,打开: -bin.tar.gz -C /home/software/ 修改并保存环境配置: gedit /etc/ ...