如何与正在运行的JVM上附加的jvmti代理进行通信

时间:2015-04-12 02:11:09

标签: java jvmti

我想知道如何与使用attach API在运行的JVM上附加的jvmti代理进行通信。当我说通信时,这就是我的意思:我想调用位于我的jvmti代理上的本机函数,这些函数将返回正在运行的JVM的数据(如字段值),我感染了#34; ;早些时候与代理商合作。

这是代理人;我还没有添加原生函数:

#include <jvmti.h>

JNIEXPORT jint JNICALL Agent_OnAttach(JavaVM* vm, char* options, void* reserved);
jvmtiEnv* create_jvmti_env(JavaVM* vm);
JNIEnv* create_jni_env(JavaVM* vm);
void init_jvmti_capabilities(jvmtiEnv* env);

JNIEXPORT jint JNICALL Agent_OnAttach(JavaVM* vm, char* options, void* reserved) {
    jvmtiEnv* jvmti = create_jvmti_env(vm);
    init_jvmti_capabilities(jvmti);
    JNIEnv* jni = create_jni_env(vm);
    return JNI_OK;
}

jvmtiEnv* create_jvmti_env(JavaVM* vm) {
    jvmtiEnv* env;
    vm->GetEnv((void **) &env, JVMTI_VERSION_1_2);
    return env;
}

JNIEnv* create_jni_env(JavaVM* vm) {
    JNIEnv* env;
    vm->GetEnv( (void **) &env, JNI_VERSION_1_8);
    return env;
}

void init_jvmti_capabilities(jvmtiEnv* env) {
    jvmtiCapabilities capabilities;
    env->GetPotentialCapabilities( &capabilities);
    env->AddCapabilities( &capabilities);
}

2 个答案:

答案 0 :(得分:0)

  

如何使用attach API与运行JVM上附加的jvmti代理进行通信。

如果我理解你在这里做的正确,那完全取决于你的外部应用程序如何与代理进行通信,但是你也可以自己实现它......从设计或选择有线协议开始你打算用。

答案 1 :(得分:0)

您可以尝试使用JNI注册本机方法。我还没有测试过这个,但你可能会尝试这样的事情:

向应该与JVMTI代理通信的类添加本机方法:

public native MyResponseType myNativeMethod (MyRequestType obj);

然后使用JNI将此Java方法绑定到JVMTI代理的某个方法:

static JNINativeMethod methods[] = {
    {"myNativeMethod", "(Lmy/package/MyRequestType;)Lmy/package/MyResponseType;", (void *)&native_method}
}; 

jni->RegisterNatives(cls, methods, 1);

其中cls是对包含本机方法的类的jclass引用。