1 /*
2 * Copyright (c) 2007, 2019, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
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
31 #define FILE_NAME "nsk/jvmti/scenarios/hotswap/HS302/hs302t002/MyClass"
32 #define CLASS_NAME "Lnsk/jvmti/scenarios/hotswap/HS302/hs302t002/MyClass;"
33
callbackClassPrepare(jvmtiEnv * jvmti_env,JNIEnv * jni_env,jthread thread,jclass klass)34 void JNICALL callbackClassPrepare(jvmtiEnv *jvmti_env,
35 JNIEnv* jni_env,
36 jthread thread,
37 jclass klass) {
38 char * className;
39 char * generic;
40 int redefineNumber;
41 redefineNumber=0;
42 jvmti_env->GetClassSignature(klass, &className, &generic);
43 if (strcmp(className,CLASS_NAME) == 0) {
44 char fileName[512];
45 nsk_jvmti_disableNotification(jvmti_env, JVMTI_EVENT_CLASS_PREPARE, NULL);
46 nsk_jvmti_getFileName(redefineNumber, FILE_NAME, fileName, sizeof(fileName)/sizeof(char));
47 if (nsk_jvmti_redefineClass(jvmti_env, klass, fileName)) {
48 nsk_printf("Redefine successful ..\n");
49 } else {
50 nsk_printf("Redefine failed .. \n");
51 }
52 }
53 }
54
55 #ifdef STATIC_BUILD
Agent_OnLoad_hs302t002(JavaVM * jvm,char * options,void * reserved)56 JNIEXPORT jint JNICALL Agent_OnLoad_hs302t002(JavaVM *jvm, char *options, void *reserved) {
57 return Agent_Initialize(jvm, options, reserved);
58 }
Agent_OnAttach_hs302t002(JavaVM * jvm,char * options,void * reserved)59 JNIEXPORT jint JNICALL Agent_OnAttach_hs302t002(JavaVM *jvm, char *options, void *reserved) {
60 return Agent_Initialize(jvm, options, reserved);
61 }
JNI_OnLoad_hs302t002(JavaVM * jvm,char * options,void * reserved)62 JNIEXPORT jint JNI_OnLoad_hs302t002(JavaVM *jvm, char *options, void *reserved) {
63 return JNI_VERSION_1_8;
64 }
65 #endif
Agent_Initialize(JavaVM * vm,char * options,void * reserved)66 jint Agent_Initialize(JavaVM *vm, char *options, void *reserved) {
67 jint rc ;
68 jvmtiEnv * jvmti;
69
70 nsk_printf("Agent:: VM.. Started..\n");
71 rc=vm->GetEnv((void **)&jvmti, JVMTI_VERSION_1_1);
72 if (rc != JNI_OK) {
73 nsk_printf("Agent:: Could not load JVMTI interface \n");
74 return JNI_ERR;
75 } else {
76 jvmtiCapabilities caps;
77 jvmtiEventCallbacks eventCallbacks;
78
79 if (!nsk_jvmti_parseOptions(options)) {
80 nsk_printf("# error agent Failed to parse options \n");
81 return JNI_ERR;
82 }
83
84 memset(&caps, 0, sizeof(caps));
85 caps.can_redefine_classes = 1;
86 caps.can_generate_all_class_hook_events=1;
87 jvmti->AddCapabilities(&caps);
88 memset(&eventCallbacks, 0, sizeof(eventCallbacks));
89 eventCallbacks.ClassPrepare = &callbackClassPrepare;
90 rc=jvmti->SetEventCallbacks(&eventCallbacks,
91 sizeof(eventCallbacks));
92
93 if (rc != JVMTI_ERROR_NONE) {
94 nsk_printf(" Agent:: Error occured while setting event call back \n");
95 return JNI_ERR;
96 }
97 if (nsk_jvmti_enableNotification(jvmti, JVMTI_EVENT_CLASS_PREPARE, NULL)) {
98 nsk_printf(" Enabled. noftification..");
99 } else {
100 nsk_printf(" Failed to Enable ..");
101 }
102 }
103 return JNI_OK;
104 }
105
106 }
107