Question

Y at-il une belle API Java je peux utiliser au-dessus de JVMTI?

Était-ce utile?

La solution

ok ... juste essayé ... semble fonctionner comme prévu .... dans la vie réelle le rappel VMInit retournerait une instance d'une classe qui a mis en œuvre une interface qui reflète l'interface C JVMTI .... le l'agent C stockerait cette instance et l'appeler en cas de besoin sur les événements .... plus avant la VMInit Java est retourné il mis en place des capacités et callbacks et enregistrer les événements etc .... vous seriez probablement en mesure d'obtenir environ 90% API JVMTI la couverture ..... il est juste une affaire de taper dans .... je pouvais le faire en un week-end si vous avez un cas fort: -)

le code suivant produit ceci:

C: VMInit, la préparation à la méthode callback Java
Java:. JVMTI classe de rappel, VMInit ()
C: VMInit, méthode de rappel Java retourné avec succès
Java: Enfin ... Bonjour, je suis le principal
Java


package com.stackoverflow;

public class JVMTICallback {

    public static void VMInit() {

        System.out.println("Java:\tJVMTI callback class, VMInit().");

    }

    public static void main(String[] args) {
        // This main is only here to give us something to run for the test

        System.out.println("Java:\tAnd Finally... Hello, I'm the Java main");
    }

}

et C

#include <stdlib.h>
#include "jvmti.h"

jvmtiEnv *globalJVMTIInterface;

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

  printf("C:\tVMInit, preparing to callback Java method\n");

  char *className = "com/stackoverflow/JVMTICallback";
  char *methodName = "VMInit";
  char *descriptor = "()V";

  jclass callbackClass = (*jni_env)->FindClass(jni_env, className);

  if (!callbackClass) {
      fprintf(stderr,"C:\tUnable to locate callback class.\n");
      return;
      }

  jmethodID callbackMethodID = (*jni_env)->GetStaticMethodID(jni_env, callbackClass, methodName, descriptor);

  if (!callbackMethodID)
    {
      fprintf(stderr, "C:\tUnable to locate callback VMInit method\n");
      return;
    }

  (*jni_env)->CallStaticVoidMethodV(jni_env, callbackClass, callbackMethodID, NULL);

  printf("C:\tVMInit, callback Java method returned successfully\n");


}

JNIEXPORT jint JNICALL
Agent_OnLoad(JavaVM * jvm, char *options, void *reserved)
{

  jint returnCode = (*jvm)->GetEnv(jvm, (void **) &globalJVMTIInterface,
      JVMTI_VERSION_1_0);

  if (returnCode != JNI_OK)
    {
      fprintf(stderr,
          "The version of JVMTI requested (1.0) is not supported by this JVM.\n");
      return JVMTI_ERROR_UNSUPPORTED_VERSION;
    }

  jvmtiEventCallbacks *eventCallbacks;

  eventCallbacks = calloc(1, sizeof(jvmtiEventCallbacks));
  if (!eventCallbacks)
    {
      fprintf(stderr, "Unable to allocate memory\n");
      return JVMTI_ERROR_OUT_OF_MEMORY;
    }

  eventCallbacks->VMInit = &vmInit;

  returnCode = (*globalJVMTIInterface)->SetEventCallbacks(globalJVMTIInterface,
      eventCallbacks, (jint) sizeof(*eventCallbacks));
  if (returnCode != JNI_OK)
    {
      fprintf(stderr, "C:\tJVM does not have the required capabilities (%d)\n",
          returnCode);
      exit(-1);
    }

  returnCode = (*globalJVMTIInterface)->SetEventNotificationMode(
      globalJVMTIInterface, JVMTI_ENABLE, JVMTI_EVENT_VM_INIT, (jthread) NULL);
  if (returnCode != JNI_OK)
    {
      fprintf(
          stderr,
          "C:\tJVM does not have the required capabilities, JVMTI_ENABLE, JVMTI_EVENT_VM_INIT (%d)\n",
          returnCode);
      exit(-1);
    }

  return JVMTI_ERROR_NONE;
}

Autres conseils

JVMTI n'a pas été construit pour avoir API Java sur le dessus. La définition JVM TI lui-même dit:

L'interface de l'outil machine virtuelle Java (JVM TI) est une API native standard qui permet de bibliothèques natives à des événements de capture et de contrôle pour la plate-forme Java une machine virtuelle Java (JVM).

Comme il a été construit pour l'API native pour capturer les événements et les contrôles, je ne pense pas qu'il y API sur le dessus de celui-ci. Puissiez vous pouvez expliquer ce que vous essayez d'atteindre?

Je ne suis pas au courant d'une API Java sur le dessus de la machine virtuelle Java TI.

Je cherchai autour et ne peut malheureusement pas trouver une bibliothèque API Java sur le dessus de JVMTI. On dirait que vous êtes hors de la chance.

Qu'est-ce que vous pouvez faire est d'appeler si un lib natif de votre code Java. Je ne suis pas très bon à C / C ++, mais de JVMTI docs, je vois qu'il est possible de construire une petite bibliothèque partagée en-têtes fournis . Ensuite, vous pouvez appeler à l'aide de la JNA **. Il vous donnera une belle wrapper API dans la bibliothèque native.

Jetez un oeil à des exemples JNA page Mise en route

Cette page est également liée à JNAerator qui peut générer toutes les liaisons Java nécessaires pour vous.

L'inconvénient de cette approche est une nécessité de maintenir cette mince couche native pour vos plates-formes cibles.


** JNA traite un moteur d'exécution en tête par rapport à d'habitude, mais la facilité JNI des avantages de performance de développement de l'OMI. Passer au JNI que si vous Vous .

Il ne fonctionnera pas. JVMTI a callbacks que le code Java n'a pas de contrôle direct sur (comme ClassPrepare). Si ces callbacks sont mises en œuvre en Java, l'exécution peut entraîner d'autres callbacks provoquant l'impasse.

il ne serait pas difficile d'écrire .... juste thunk JVMTI appelle à callback une classe Java sur JNI .. vous auriez probablement faire face à quelques problèmes ... tout d'abord le Agent_onLoad .. ce premier « enregistrement » fonction arrive trop tôt dans le cycle de vie de la machine virtuelle java pour qu'il callback votre java .... d'autre part, il y a des problèmes potentiels de circularité et la probabilité que la machine virtuelle java a été écrite vous attend à quoi que ce soit comme ça cela à ...

ILL essayer d'écrire un exemple .... dans quelques minutes ...

JDI est une interface de niveau TOP écrit en Java, qui utilise JVMTI comme api back-end. ce lien vous donne les informations détaillées.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top