20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 */
23 #include <jni.h>
24 #include <jvmti.h>
25 #include "agent_common.h"
26 #include <string.h>
27 #include "jvmti_tools.h"
28
29 extern "C" {
30 #define FILE_NAME "nsk/jvmti/scenarios/hotswap/HS301/hs301t004/MyClass"
31 #define CLASS_NAME "Lnsk/jvmti/scenarios/hotswap/HS301/hs301t004/MyClass;"
32
33 void JNICALL callbackClassPrepare(jvmtiEnv *jvmti_env,
34 JNIEnv* jni_env,
35 jthread thread,
36 jclass klass) {
37 char * className;
38 char * generic;
39 int redefineNumber=0;
40 if (! NSK_JVMTI_VERIFY( NSK_CPP_STUB4(GetClassSignature,
41 jvmti_env, klass, &className, &generic)) ) {
42 nsk_printf(" Agent :: Error occured in getting class signature.\n");
43 return;
44 } else {
45 if (strcmp(className, CLASS_NAME) == 0) {
46 int redefineNumber =0;
47 char fileName[512];
48 nsk_jvmti_disableNotification(jvmti_env, JVMTI_EVENT_CLASS_PREPARE, NULL );
49 nsk_jvmti_getFileName(redefineNumber, FILE_NAME, fileName,
50 sizeof(fileName)/sizeof(char));
51 if (nsk_jvmti_redefineClass(jvmti_env, klass, fileName) == NSK_TRUE ) {
52 nsk_printf("Agent:: Redefine successful.\n");
53 } else {
54 nsk_printf("Agent:: Redefine failed.\n");
55 }
56 }
57 }
58 }
59
60 #ifdef STATIC_BUILD
61 JNIEXPORT jint JNICALL Agent_OnLoad_hs301t004(JavaVM *jvm, char *options, void *reserved) {
62 return Agent_Initialize(jvm, options, reserved);
63 }
64 JNIEXPORT jint JNICALL Agent_OnAttach_hs301t004(JavaVM *jvm, char *options, void *reserved) {
65 return Agent_Initialize(jvm, options, reserved);
66 }
67 JNIEXPORT jint JNI_OnLoad_hs301t004(JavaVM *jvm, char *options, void *reserved) {
68 return JNI_VERSION_1_8;
69 }
70 #endif
71 jint Agent_Initialize(JavaVM *vm, char *options, void *reserved) {
72 jvmtiEnv * jvmti;
73 nsk_printf("Agent:: VM Started.\n");
74 if (! NSK_VERIFY ( JNI_OK == NSK_CPP_STUB3(GetEnv,
75 vm, (void **)&jvmti, JVMTI_VERSION_1_1) ) ) {
76 nsk_printf("Agent:: Could not load JVMTI interface \n");
77 return JNI_ERR;
78 } else {
79 jvmtiCapabilities caps;
80 jvmtiEventCallbacks eventCallbacks;
81 if (nsk_jvmti_parseOptions(options) == NSK_FALSE ) {
82 nsk_printf("# error agent Failed to parse options \n");
83 return JNI_ERR;
84 }
85 memset(&caps, 0, sizeof(caps));
86 caps.can_redefine_classes = 1;
87 caps.can_generate_all_class_hook_events=1;
88 if ( ! NSK_JVMTI_VERIFY ( NSK_CPP_STUB2(AddCapabilities,
89 jvmti, &caps) )) {
90 nsk_printf(" Agent:: Error occured while adding capabilities.\n");
91 return JNI_ERR;
92 }
93 memset(&eventCallbacks, 0, sizeof(eventCallbacks));
94 eventCallbacks.ClassPrepare = &callbackClassPrepare;
95 if ( ! NSK_JVMTI_VERIFY( NSK_CPP_STUB3(SetEventCallbacks,
96 jvmti, &eventCallbacks, sizeof(eventCallbacks)) ) ) {
97 nsk_printf(" Agent:: Error occured while setting event call back \n");
98 return JNI_ERR;
99 }
100 if ( nsk_jvmti_enableNotification(jvmti, JVMTI_EVENT_CLASS_PREPARE, NULL) == NSK_TRUE ) {
101 nsk_printf(" Enabled notification.\n");
102 } else {
103 nsk_printf(" Failed to enable notifications.\n");
104 }
105 }
106 return JNI_OK;
107 }
108
109 }
|
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 */
23 #include <jni.h>
24 #include <jvmti.h>
25 #include "agent_common.h"
26 #include <string.h>
27 #include "jvmti_tools.h"
28
29 extern "C" {
30 #define FILE_NAME "nsk/jvmti/scenarios/hotswap/HS301/hs301t004/MyClass"
31 #define CLASS_NAME "Lnsk/jvmti/scenarios/hotswap/HS301/hs301t004/MyClass;"
32
33 void JNICALL callbackClassPrepare(jvmtiEnv *jvmti_env,
34 JNIEnv* jni_env,
35 jthread thread,
36 jclass klass) {
37 char * className;
38 char * generic;
39 int redefineNumber=0;
40 if (! NSK_JVMTI_VERIFY(jvmti_env->GetClassSignature(klass, &className, &generic)) ) {
41 nsk_printf(" Agent :: Error occured in getting class signature.\n");
42 return;
43 } else {
44 if (strcmp(className, CLASS_NAME) == 0) {
45 int redefineNumber =0;
46 char fileName[512];
47 nsk_jvmti_disableNotification(jvmti_env, JVMTI_EVENT_CLASS_PREPARE, NULL );
48 nsk_jvmti_getFileName(redefineNumber, FILE_NAME, fileName,
49 sizeof(fileName)/sizeof(char));
50 if (nsk_jvmti_redefineClass(jvmti_env, klass, fileName) == NSK_TRUE ) {
51 nsk_printf("Agent:: Redefine successful.\n");
52 } else {
53 nsk_printf("Agent:: Redefine failed.\n");
54 }
55 }
56 }
57 }
58
59 #ifdef STATIC_BUILD
60 JNIEXPORT jint JNICALL Agent_OnLoad_hs301t004(JavaVM *jvm, char *options, void *reserved) {
61 return Agent_Initialize(jvm, options, reserved);
62 }
63 JNIEXPORT jint JNICALL Agent_OnAttach_hs301t004(JavaVM *jvm, char *options, void *reserved) {
64 return Agent_Initialize(jvm, options, reserved);
65 }
66 JNIEXPORT jint JNI_OnLoad_hs301t004(JavaVM *jvm, char *options, void *reserved) {
67 return JNI_VERSION_1_8;
68 }
69 #endif
70 jint Agent_Initialize(JavaVM *vm, char *options, void *reserved) {
71 jvmtiEnv * jvmti;
72 nsk_printf("Agent:: VM Started.\n");
73 if (! NSK_VERIFY ( JNI_OK == vm->GetEnv((void **)&jvmti, JVMTI_VERSION_1_1) ) ) {
74 nsk_printf("Agent:: Could not load JVMTI interface \n");
75 return JNI_ERR;
76 } else {
77 jvmtiCapabilities caps;
78 jvmtiEventCallbacks eventCallbacks;
79 if (nsk_jvmti_parseOptions(options) == NSK_FALSE ) {
80 nsk_printf("# error agent Failed to parse options \n");
81 return JNI_ERR;
82 }
83 memset(&caps, 0, sizeof(caps));
84 caps.can_redefine_classes = 1;
85 caps.can_generate_all_class_hook_events=1;
86 if ( ! NSK_JVMTI_VERIFY (jvmti->AddCapabilities(&caps) )) {
87 nsk_printf(" Agent:: Error occured while adding capabilities.\n");
88 return JNI_ERR;
89 }
90 memset(&eventCallbacks, 0, sizeof(eventCallbacks));
91 eventCallbacks.ClassPrepare = &callbackClassPrepare;
92 if ( ! NSK_JVMTI_VERIFY(jvmti->SetEventCallbacks(&eventCallbacks, sizeof(eventCallbacks)) ) ) {
93 nsk_printf(" Agent:: Error occured while setting event call back \n");
94 return JNI_ERR;
95 }
96 if ( nsk_jvmti_enableNotification(jvmti, JVMTI_EVENT_CLASS_PREPARE, NULL) == NSK_TRUE ) {
97 nsk_printf(" Enabled notification.\n");
98 } else {
99 nsk_printf(" Failed to enable notifications.\n");
100 }
101 }
102 return JNI_OK;
103 }
104
105 }
|