从 Native 函数调用 Java 函数

前言

要想深入地理解 art 虚拟机,那么理解 Java 方法在虚拟机当中是如何执行的是必不可少的一环。
本篇从 Native 函数调用 Java 函数角度来探讨一下 Java 函数在 art 虚拟机当中的执行。(基于 Android 8.1)

一、调用流程

首先,我们用 gdb 将断点打在 art_quick_invoke_stub,观察一下 Native 函数 -> Java 函数的调用栈:
这里写图片描述

点击查看大图

我们可以看到 Native 函数调用 Java 函数最开始是要调用 env->CallBooleanMethod:

(gdb) f 6
#6  0x000000798f46c2d0 in JavaBBinder::onTransact (this=0x79032efa80, code=4, data=..., reply=0x78f55fd1c0, flags=17) at frameworks/base/core/jni/android_util_Binder.cpp:312
312         jboolean res = env->CallBooleanMethod(mObject, gBinderOffsets.mExecTransact,
(gdb) list
307         const int32_t strict_policy_before = thread_state->getStrictModePolicy();
308 
309         //printf("Transact from %p to Java code sending: ", this);
310         //data.print();
311         //printf("\n");
312         jboolean res = env->CallBooleanMethod(mObject, gBinderOffsets.mExecTransact,
313             code, reinterpret_cast<jlong>(&data), reinterpret_cast<jlong>(reply), flags);
314 
315         if (env->ExceptionCheck()) {
316             jthrowable excep = env->ExceptionOccurred();

1、CallBooleanMethod

我们来看一下 CallBooleanMethod 定义:
libnativehelper/include_jni/jni.h

594#define CALL_TYPE_METHOD(_jtype, _jname)                                    \
595    _jtype Call##_jname##Method(jobject obj, jmethodID methodID, ...)       \
596    {                                                                       \
597        _jtype result;                                                      \
598        va_list args;                                                       \
599        va_start(args, methodID);                                           \
600        result = functions->Call##_jname##MethodV(this, obj, methodID,      \
601                    args);                                                  \
602        va_end(args);                                                       \
603        return result;                                                      \
604    }
605#define CALL_TYPE_METHODV(_jtype, _jname)                                   \
606    _jtype Call##_jname##MethodV(jobject obj, jmethodID methodID,           \
607        va_list args)                                                       \
608    { return functions->Call##_jname##MethodV(this, obj, methodID, args); }
609#define CALL_TYPE_METHODA(_jtype, _jname)                                   \
610    _jtype Call##_jname##
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值