Simple_android 2018-12-19 16:58 采纳率: 0%
浏览 247

C++内存布局相关问题 (android framework层 )

源码地址:http://androidxref.com/5.1.0_r1/xref/art/runtime/runtime.h#555

通过手段拿到Runtime指针runtime*后,想通过偏移量去拿heap_的指针,看网上有类似代码,heap的偏移量为188,求大神解答为何是188。

相关代码:

    JavaVMExt *vmExt = (JavaVMExt *) mirror_vm;
    char *runtime_ptr = (char *) vmExt->runtime;
    void **heap_pp = (void **) (runtime_ptr + 188);
    char *c_heap = (char *) (*heap_pp);

    char *min_free_offset = c_heap + 532;
    char *max_free_offset = min_free_offset + 4;

    size_t *min_free_ = (size_t *) min_free_offset;
    size_t *max_free_ = (size_t *) max_free_offset;
    *min_free_ = 1024 * 1024 * min;
    *max_free_ = 1024 * 1024 * max;
  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-08-07 11:56
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    在Android的JNI中,runtime_ptrheap_pp都是指向JavaVMExt类的一个成员变量。heap_pp指向的是一个指向Heap结构体数组的指针,而Heap又是一个指向HeapBlock结构体的指针。

    Heap是一个结构体类型,它包含了关于堆内存的一些信息,包括分配的大小、起始位置等。在JNI中,这些信息通常以字节流的形式存储在堆上。因此,当我们访问heap_pp时,实际上是访问了堆上的字节流数据。

    heap_pp的偏移量是从runtime_ptr开始计算的,而不是直接从runtime_ptr开始。这是因为runtime_ptr包含了一个指向JavaVMExt的指针,而这个指针实际上也指向了堆上的字节流数据。因此,我们需要将runtime_ptr向前移动188个字节(即偏移量),才能到达heap_pp所指向的HeapBlock的数据。

    所以,正确的偏移量应该是runtime_ptr + 188,而不是直接使用runtime_ptr

    评论

报告相同问题?

悬赏问题

  • ¥30 STM32 INMP441无法读取数据
  • ¥100 求汇川机器人IRCB300控制器和示教器同版本升级固件文件升级包
  • ¥15 用visualstudio2022创建vue项目后无法启动
  • ¥15 x趋于0时tanx-sinx极限可以拆开算吗
  • ¥500 把面具戴到人脸上,请大家贡献智慧
  • ¥15 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。
  • ¥15 各位 帮我看看如何写代码,打出来的图形要和如下图呈现的一样,急
  • ¥30 c#打开word开启修订并实时显示批注
  • ¥15 如何解决ldsc的这条报错/index error
  • ¥15 VS2022+WDK驱动开发环境