我有一个使用Java Attach API附加的本机JVMTI代理。代理基本上只运行Agent_OnAttach
然后存在。我想将代理中的信息传递给附加代理的VM。即使只是写入附加代理的VM的stdout也没关系。我知道我可以使用带外装置,如插座或命名管道,但我正在寻找内置的东西。
答案 0 :(得分: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 ......