【问题标题】:C++ Call a function inside a running JVMC++ 在正在运行的 JVM 中调用函数
【发布时间】:2019-03-21 18:20:06
【问题描述】:

我想创建一个 C++ 应用程序,它将调用 正在运行的 Java 应用程序中的一个函数。这是我的 Java 应用程序的代码:

package me.jumpak.testapp;

public class TestClass {
    public static void main(String[] args) {
        System.out.println("Hello World!");
    }

    public static void mymain() {   // <=== I want to call this function
        System.out.println("Hello, World in java from mymain");
    }
}

所以我希望 C++ 应用程序以某种方式“注入”到正在运行的 JVM 进程中并调用函数 mymain,以便执行该函数并打印消息(来自 mymain 的 Java 中的 Hello,World)。我知道这是可能的,但不知道该怎么做。 我不知道从哪里开始,也不知道如何在 C++ 中执行此操作。我试过谷歌搜索,但还没有找到任何东西。

【问题讨论】:

    标签: java c++ code-injection


    【解决方案1】:

    您总是使用 c++ 中的 JNI 创建或附加到现有 jvm 实例,并创建对象或调用方法...

    类似...

    // Connect to an existing jvm
    jint vm = JNI_GetCreatedJavaVMs(...
    
    // Find the class
    jclass cls = env->FindClass("your/namespace/Class");
    
    // Get the method
    jmethodID m = env->GetMethodID(clsm, "methodToInvoke", "()V");
    
    // Call the method on the object
    jobject res = env->CallObjectMethod(objInstance, m);
    

    https://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/invocation.html

    【讨论】:

    • 还有一件事:什么是 jstr?
    • 在本例中,您调用一个对象实例的方法(调用实例 objInstance 的方法 m)。如果要调用静态方法,请使用 GetStaticMethodID 和 CallStatic*Method
    猜你喜欢
    • 1970-01-01
    • 2011-07-16
    • 1970-01-01
    • 1970-01-01
    • 2016-05-24
    • 1970-01-01
    • 1970-01-01
    • 2013-03-10
    • 1970-01-01
    相关资源
    最近更新 更多