gpt4 book ai didi

java - 使用NDK获取Object的指向内存地址

转载 作者:行者123 更新时间:2023-12-01 22:38:23 30 4
gpt4 key购买 nike

我目前正在进行一次好奇的旅行,我正在尝试创建一个返回 Java 对象 内存地址的 native 方法。

我已经正确配置了Android的NDK,我的Java方法是:

public static native String getAddressOf(Object obj);

接下来是我在 C 中的 native 实现:

jstring Java_com_danysantiago_andmemutil_MemoryUtils_getAddressOf(JNIEnv *env, jobject clazz, jobject obj) {
char buffer[11];
sprintf(buffer, "%p", obj);
return (*env)->NewStringUTF(env, buffer);
}

但由于某种原因,无论我在模拟器上使用该应用程序多少次,返回的字符串地址始终相同。我假设我没有获得实际的内存指针,或者我对对象如何存储在内存中的 Java 知识是错误的。

更多背景故事:我已成功获取标准 Java 应用程序中 Object 的地址,该应用程序在我的计算机 JVM 上运行,如下 this stackoverflow answer 。我之所以能够确认这一点,是因为我进行了堆转储,然后使用 MAT搜索地址,得到我的虚拟类的一个实例。但是,sun.misc.unsafe 在 Android 中不可用。

当我尝试遵循类似的步骤,对 Android 应用程序进行堆转储并搜索该方法返回的地址时,我没有得到任何结果,但如果我使用 OQL ,这可通过 MAT 使用,我可以找到具有不同地址的虚拟类的实例。

看看如何使用 unsafe 获取地址,让我想知道实际上我也必须使用 native 代码来计算检查 Object 字段的地址。

请带上您的知识优秀的人!谢谢! :)

最佳答案

一般情况下你不能这样做。

Dalvik 过去通过 JNI 传递对象地址,但在 ICS 版本中改用间接引用。这样做的动机是为了更容易地移动堆中的对象,例如用于压缩垃圾收集器。如果应用程序代码可以获得 JNI 可见的任何对象的地址,那么 GC 将无法移动这些对象,因为 native 代码可能在 GC 运行时访问它们。 (从 Android 4.4 KitKat 开始,对象没有移动,但我认为在即将发布的版本中这会发生变化。)

我认为大多数版本的Android都会从System#identityHashCode()返回对象地址,避免使用 JNI,但如果现在有效,我预计它也会很快崩溃。

当然,如果您确实获得了地址,它只会告诉您该地址曾经是什么,而不是该地址是什么,因为虚拟机是可以随时自由地重新定位对象。

关于java - 使用NDK获取Object的指向内存地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26559013/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com