Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何与连接在运行JVM上的jvmti代理通信_Java_Jvmti - Fatal编程技术网

Java 如何与连接在运行JVM上的jvmti代理通信

Java 如何与连接在运行JVM上的jvmti代理通信,java,jvmti,Java,Jvmti,我想知道如何使用attach API与连接在运行的JVM上的jvmti代理进行通信。当我说communicate时,我的意思是:我想调用jvmti代理上的本机函数,这些函数将返回我之前用代理感染的运行JVM的字段值等数据 代理人来了;我还没有添加本机函数: #include <jvmti.h> JNIEXPORT jint JNICALL Agent_OnAttach(JavaVM* vm, char* options, void* reserved); jvmtiEnv* cre

我想知道如何使用attach API与连接在运行的JVM上的jvmti代理进行通信。当我说communicate时,我的意思是:我想调用jvmti代理上的本机函数,这些函数将返回我之前用代理感染的运行JVM的字段值等数据

代理人来了;我还没有添加本机函数:

#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);
}
如何使用attach API与连接在运行JVM上的jvmti代理进行通信


如果我正确地理解了您在这里所做的事情,那么您的外部应用程序如何与代理通信完全取决于您,但实现它也取决于您。。。从设计或选择要使用的有线协议开始。

您可以尝试使用JNI注册本机方法。我尚未对此进行测试,但您可以尝试以下方法:

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

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

jni->RegisterNatives(cls, methods, 1);
然后使用JNI将此Java方法绑定到JVMTI代理的某个方法:

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

jni->RegisterNatives(cls, methods, 1);
其中cls是对包含本机方法的类的jclass引用