Вопрос

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

Это было полезно?

Решение

Хорошо ... только что попробовал ... кажется, работает так, как и ожидалось .... В реальной жизни Vminit обратный вызов вернет экземпляр класса, который реализовал интерфейс, который отражал интерфейс C JVMTI .... Агент C Храните этот экземпляр и позвоните в него при необходимости на событиях .... Кроме того, до возвращения vminit java он установит возможности и обратные вызовы, а также зарегистрировать события и т. Д. ... это просто случай печати ... Я мог бы сделать это в выходные, если у вас есть сильный случай :-)

Следующий код создает это:

C: Vminit, подготовка к методу обратного вызова Java
Java: JVMTI Callback Class, 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");
    }

}

и 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;
}

Другие советы

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

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

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

Я не знаю ни одного Java API на вершине JVM Ti.

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

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

Посмотрите на примеры на JNA начинается

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

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


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

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

Это не было бы сложно писать .... просто разгорайте звонки JVMTI, чтобы обратить внимание на класс Java по JNI .. Вы, вероятно, столкнетесь с несколькими проблемами ... Во -первых, Agent_onload .. Эта начальная «регистрация» тоже происходит В начале жизненного цикла JVM, чтобы он обратился к вашей Java ... Во -вторых, есть потенциальные проблемы с циркуляцией и вероятность того, что JVM был написан, ожидая, что вы сделаете что -то подобное на ...

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top