问题描述
public class some_class
{
public static void som_func() {
var some_object = new SomeObject();
var ret = 0;
do
{
ret = some_object.DoSomething();
} while(ret != 1);
System.out.printf("Return value: %d",ret);
}
}
现在在 C++ 中,如果我这样调用:
auto some_cls = g_env->FindClass("some_class");
auto some_func = g_env->GetStaticmethodID(some_cls,"som_func","()V");
g_env->CallStaticVoidMethod(some_cls,some_func);
有什么办法可以访问
some_object
变量 var some_object = new SomeObject();
或者通过 JNI 或任何 JVM 内存访问技巧使用 ret
变量 var ret = 0;
?
我想做类似的事情:
auto some_object_class = g_env->FindClass("SomeObject");
/*
and then some way this 'some_object_class' will be a reference to that local variable 'some_object'
*/
我想我想知道如何访问 JVM 的堆内存?我听说 JVM 在堆上分配一个对象,并且对该分配对象的引用存储在堆栈中,如果是这种情况,我可以访问该堆栈内存并检索该引用吗?我很困惑,我想我最终不知道我在说什么。请引导我走向正确的道路。
解决方法
做不到。请注意,您也无法从常规 Java 方法访问这些局部变量。部分问题在于该方法不知道这些局部变量在哪里。它们可能在堆栈帧中分配,也可能在寄存器中。即使您实现了一些汇编代码来直接访问堆栈和寄存器,您也不知道该往哪里看,而且由于 JVM 代码编译的动态特性,这些位置可能会发生变化。