0

我有一个使用 Java Attach API 附加的本机 JVMTI 代理。代理基本上只是运行Agent_OnAttach然后存在。我想将信息从代理传递到附加代理的虚拟机。即使只是写入附加代理的 VM 的标准输出也可以。我知道我可以使用诸如套接字或命名管道之类的带外方式,但我正在寻找内置的东西。

4

1 回答 1

0

您真的想与 JVM 或内部运行的应用程序通信吗?如果您想与您的应用程序对话,Agent_Onload 会太早,因为您的应用程序尚未加载。相反,您可以使用 VMInit 事件:

void JNICALL
VMInit(jvmtiEnv *jvmti_env,
        JNIEnv* jni_env,
        jthread thread)

这使您可以访问 JNI,从而使您可以执行 java 代码。例如,您可以使用它来设置稍后可以由您的类读取的系统属性。如果您想与任何特定班级进行交流,此事件可能还为时过早,您可能会等待相应的 ClassPrepare 事件并检查您的班级何时可用:

void JNICALL
ClassPrepare(jvmtiEnv *jvmti_env,
        JNIEnv* jni_env,
        jthread thread,
        jclass klass)

如果要写入stdout,当然可以使用JNI调用System.println...

于 2014-12-23T08:50:42.173 回答