2010-12-29 6 views
1

JVM TI _jclassの名前を取得する方法は? JVMTIエージェントにロードされたクラスの名前を表示したいのですが、_jclassインスタンスからクラスの名前を取得する方法はわかりません。JVMTI _jclass toString

答えて

3

これは必要なものですか?

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

jvmtiEnv *globalJVMTIInterface; 

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

    printf("VMStart\n"); 

    jint numberOfClasses; 
    jclass *classes; 

    jint returnCode = (*globalJVMTIInterface)->GetLoadedClasses(globalJVMTIInterface, &numberOfClasses, &classes); 
    if (returnCode != JVMTI_ERROR_NONE) { 
     fprintf(stderr, "Unable to get a list of loaded classes (%d)\n", returnCode); 
     exit(-1); 
    } 

    int i; 

    for(i=0;i<numberOfClasses;i++) { 

     char* signature = NULL; 
     char* generic = NULL; 

     (*globalJVMTIInterface)->GetClassSignature(globalJVMTIInterface, classes[i], &signature, &generic); 

     printf("%d) %s %s\n", i+1, signature, generic); 

     if(signature) { 
      returnCode = (*globalJVMTIInterface)->Deallocate(globalJVMTIInterface, (unsigned char*) signature); 
     } 
     if(generic) { 
      returnCode = (*globalJVMTIInterface)->Deallocate(globalJVMTIInterface, (unsigned char*) generic); 
     } 


    } 


    if(classes) { 
     returnCode = (*globalJVMTIInterface)->Deallocate(globalJVMTIInterface, (unsigned char*) classes); 
    } 

} 

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, "JVM 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, "JVM does not have the required capabilities, JVMTI_ENABLE, JVMTI_EVENT_VM_INIT (%d)\n", returnCode); 
     exit(-1); 
    } 

    return JVMTI_ERROR_NONE; 
} 
+0

どこからこのコードを取得しましたか?それとも自分で書きましたか?何のためにJVMTIを使用していますか? – paweloque

+2

私はすぐにあなたのために書きました.....私はIBMのために働き、主に内部のJavaプロファイリングツールを書いています。私はCでBCIライブラリを書いています....実際には、これを書き直すつもりです私はおそらくオープンソースなのです。私はかなり長い間JVMTIを "生きてきました"と私は手伝ってくれると思っていました。 –

+0

非常に興味深いですね!あなたがあなたのライブラリーをオープンソースにした後、あなたに教えてもらえますか?このライブラリを書き直す際に助けが必要な場合は教えてください!私の電子メールは[email protected] – paweloque

1

私はあなたがGetClassSignature(それを試したわけではありません)から判断できると思います。