changeset 48656:589a6f1d86e9

8191229: serviceability/jvmti/GetOwnedMonitorInfo/GetOwnedMonitorInfoTest.java fails with NoClassDefFoundError Summary: call FindClass() when we are in the proper classloader context Reviewed-by: sspitsyn, dholmes, amenkov
author cjplummer
date Sat, 09 Dec 2017 07:50:50 -0800
parents ecff0c7bfb4d
children ed1bb7743b3e 7daebcef2e0d
files test/hotspot/jtreg/serviceability/jvmti/GetOwnedMonitorInfo/libGetOwnedMonitorInfoTest.c
diffstat 1 files changed, 24 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/test/hotspot/jtreg/serviceability/jvmti/GetOwnedMonitorInfo/libGetOwnedMonitorInfoTest.c	Fri Dec 08 23:43:25 2017 +0100
+++ b/test/hotspot/jtreg/serviceability/jvmti/GetOwnedMonitorInfo/libGetOwnedMonitorInfoTest.c	Sat Dec 09 07:50:50 2017 -0800
@@ -49,6 +49,7 @@
 
 static volatile jboolean event_has_posted = JNI_FALSE;
 static volatile jint status = PASSED;
+static volatile jclass testClass = NULL;
 
 static jint Agent_Initialize(JavaVM *jvm, char *options, void *reserved);
 
@@ -66,16 +67,10 @@
 }
 
 static jboolean CheckLockObject(JNIEnv *env, jobject monitor) {
-    jclass testClass;
-
-    testClass = (*env)->FindClass(env, TEST_CLASS);
     if (testClass == NULL) {
-        fprintf(stderr, "MonitorContendedEnter: " TEST_CLASS " not found\n");
-        status = FAILED;
-        event_has_posted = JNI_TRUE;
+        // JNI_OnLoad has not been called yet, so can't possibly be an instance of TEST_CLASS.
         return JNI_FALSE;
     }
-
     return (*env)->IsInstanceOf(env, monitor, testClass);
 }
 
@@ -171,7 +166,26 @@
 
 JNIEXPORT jint JNICALL
 JNI_OnLoad(JavaVM *jvm, void *reserved) {
-    return JNI_VERSION_1_8;
+    jint res;
+    JNIEnv *env;
+
+    res = JNI_ENV_PTR(jvm)->GetEnv(JNI_ENV_ARG(jvm, (void **) &env),
+                                   JNI_VERSION_9);
+    if (res != JNI_OK || env == NULL) {
+        fprintf(stderr, "Error: GetEnv call failed(%d)!\n", res);
+        return JNI_ERR;
+    }
+
+    testClass = (*env)->FindClass(env, TEST_CLASS);
+    if (testClass != NULL) {
+      testClass = (*env)->NewGlobalRef(env, testClass);
+    }
+    if (testClass == NULL) {
+        fprintf(stderr, "Error: Could not load class %s!\n", TEST_CLASS);
+        return JNI_ERR;
+    }
+
+    return JNI_VERSION_9;
 }
 
 static
@@ -185,7 +199,7 @@
     printf("Agent_OnLoad started\n");
 
     res = JNI_ENV_PTR(jvm)->GetEnv(JNI_ENV_ARG(jvm, (void **) &jvmti),
-                                   JVMTI_VERSION_1);
+                                   JVMTI_VERSION_9);
     if (res != JNI_OK || jvmti == NULL) {
         fprintf(stderr, "Error: wrong result of a valid call to GetEnv!\n");
         return JNI_ERR;
@@ -221,6 +235,7 @@
         return JNI_ERR;
     }
 
+    memset(&callbacks, 0, sizeof(callbacks));
     callbacks.MonitorContendedEnter   = &MonitorContendedEnter;
     callbacks.MonitorContendedEntered = &MonitorContendedEntered;