Java API поверх JVMTI? - PullRequest
       6

Java API поверх JVMTI?

15 голосов
/ 27 января 2011

Есть ли хороший Java API, который я могу использовать поверх JVMTI?

Ответы [ 6 ]

11 голосов
/ 31 января 2011

JVMTI не был создан для того, чтобы иметь Java API поверх.Само определение JVM TI гласит:

Интерфейс инструмента JVM (JVM TI) - это стандартный собственный API-интерфейс, который позволяет собственным библиотекам захватывать события и управлять виртуальной машиной Java (JVM)платформа Java.

Поскольку он был создан для нативного API для захвата событий и элементов управления, я не думаю, что поверх него есть API.Можете ли вы объяснить, чего вы пытаетесь достичь?

Я не знаю ни одного API Java поверх JVM TI.

4 голосов
/ 07 февраля 2011

хорошо ... только что попробовал ... кажется, работает как ожидалось .... в реальной жизни обратный вызов VMInit будет возвращать экземпляр класса, который реализовал интерфейс, который зеркально отображает интерфейс C JVMTI .... Агент C будет хранить этот экземпляр и вызывать его при необходимости в событиях .... кроме того, прежде чем VMInit Java вернет, он настроит возможности и обратные вызовы, зарегистрирует события и т. Д. .... вы, вероятно, сможете получить около 90% JVMTI API охват ..... это просто случай ввода текста .... Я мог бы сделать это на выходных, если у вас есть веские аргументы: -)

следующий код производит это:

C: VMInit, подготовка к обратному вызову метода Java
Java: класс обратного вызова JVMTI, VMInit ().
C: VMInit, метод обратного вызова Java успешно возвращен
Java: И наконец ... Здравствуйте, я главный 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");
    }

}

и С

#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;
}
3 голосов
/ 04 февраля 2011

Я искал и, к сожалению, не могу найти ни одной библиотеки Java API поверх JVMTI.Похоже, вам не повезло.

Что вы можете сделать, так это вызвать нативную библиотеку из вашего кода Java.Я не очень хорош в C / C ++, но из документации JVMTI я вижу, что можно создать небольшую общую библиотеку из заголовков .Тогда вы можете позвонить, используя JNA **.Это даст вам хорошую оболочку API вокруг родной библиотеки.

Посмотрите примеры на странице JNA Getting Started

Эта страница также ссылается на JNAerator , который может генерировать все необходимые привязки Java для вас.

Недостатком этого подхода является необходимость поддержания этого тонкого нативного слоя для ваших целевых платформ.


** JNA сделокнакладные расходы по сравнению с обычным JNI, но простота разработки перевешивает производительность IMO.Переключайтесь на JNI, только если у вас есть к.

2 голосов
/ 04 августа 2014

Это не будет работать.JVMTI имеет обратные вызовы, над которыми Java-код не имеет прямого контроля (например, ClassPrepare).Если эти обратные вызовы реализованы в Java, выполнение может привести к другим обратным вызовам, вызывающим взаимоблокировку.

1 голос
/ 07 февраля 2011

это не составит труда написать ... просто скажите, что вызовы JVMTI для обратного вызова Java-класса через JNI ... вы, вероятно, столкнетесь с парой проблем ... во-первых, с Agent_onLoad ... этой первоначальной "регистрацией" Функция происходит слишком рано в жизненном цикле JVM для того, чтобы она могла вызвать обратный вызов вашей Java .... во-вторых, существуют потенциальные проблемы с циклизацией и вероятность того, что JVM была написана, ожидая, что вы сделаете что-то подобное в этом ...

Я попытаюсь написать пример .... через несколько минут ...

0 голосов
/ 14 сентября 2014

JDI - это интерфейс верхнего уровня, написанный на Java, который использует JVMTI в качестве базового API. эта ссылка даст вам подробную информацию.

...