微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

有没有办法通过 JNI 访问 Java 方法/函数局部变量和局部对象实例

如何解决有没有办法通过 JNI 访问 Java 方法/函数局部变量和局部对象实例

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 代码编译的动态特性,这些位置可能会发生变化。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。