src/share/native/java/lang/ClassLoader.c

Print this page




 381     if (cname == 0)
 382         return;
 383     handle = isBuiltin ? procHandle : JVM_LoadLibrary(cname);
 384     if (handle) {
 385         JNI_OnLoad_t JNI_OnLoad;
 386         JNI_OnLoad = (JNI_OnLoad_t)findJniFunction(env, handle,
 387                                                isBuiltin ? cname : NULL,
 388                                                JNI_TRUE);
 389         if (JNI_OnLoad) {
 390             JavaVM *jvm;
 391             (*env)->GetJavaVM(env, &jvm);
 392             jniVersion = (*JNI_OnLoad)(jvm, NULL);
 393         } else {
 394             jniVersion = 0x00010001;
 395         }
 396 
 397         cause = (*env)->ExceptionOccurred(env);
 398         if (cause) {
 399             (*env)->ExceptionClear(env);
 400             (*env)->Throw(env, cause);

 401             JVM_UnloadLibrary(handle);

 402             goto done;
 403         }
 404 
 405         if (!JVM_IsSupportedJNIVersion(jniVersion) ||
 406             (isBuiltin && jniVersion < JNI_VERSION_1_8)) {
 407             char msg[256];
 408             jio_snprintf(msg, sizeof(msg),
 409                          "unsupported JNI version 0x%08X required by %s",
 410                          jniVersion, cname);
 411             JNU_ThrowByName(env, "java/lang/UnsatisfiedLinkError", msg);

 412             JVM_UnloadLibrary(handle);

 413             goto done;
 414         }
 415         (*env)->SetIntField(env, this, jniVersionID, jniVersion);
 416     } else {
 417         cause = (*env)->ExceptionOccurred(env);
 418         if (cause) {
 419             (*env)->ExceptionClear(env);
 420             (*env)->SetLongField(env, this, handleID, (jlong)0);
 421             (*env)->Throw(env, cause);
 422         }
 423         goto done;
 424     }
 425     (*env)->SetLongField(env, this, handleID, ptr_to_jlong(handle));
 426     (*env)->SetBooleanField(env, this, loadedID, JNI_TRUE);
 427 
 428  done:
 429     JNU_ReleaseStringPlatformChars(env, name, cname);
 430 }
 431 
 432 /*


 441     const char *onUnloadSymbols[] = JNI_ONUNLOAD_SYMBOLS;
 442     void *handle;
 443     JNI_OnUnload_t JNI_OnUnload;
 444      const char *cname;
 445 
 446     if (!initIDs(env))
 447         return;
 448     cname = JNU_GetStringPlatformChars(env, name, 0);
 449     if (cname == NULL) {
 450         return;
 451     }
 452     handle = jlong_to_ptr((*env)->GetLongField(env, this, handleID));
 453     JNI_OnUnload = (JNI_OnUnload_t )findJniFunction(env, handle,
 454                                                 isBuiltin ? cname : NULL,
 455                                                 JNI_FALSE);
 456     if (JNI_OnUnload) {
 457         JavaVM *jvm;
 458         (*env)->GetJavaVM(env, &jvm);
 459         (*JNI_OnUnload)(jvm, NULL);
 460     }

 461     JVM_UnloadLibrary(handle);

 462     JNU_ReleaseStringPlatformChars(env, name, cname);
 463 }
 464 
 465 /*
 466  * Class:     java_lang_ClassLoader_NativeLibrary
 467  * Method:    find
 468  * Signature: (Ljava/lang/String;)J
 469  */
 470 JNIEXPORT jlong JNICALL
 471 Java_java_lang_ClassLoader_00024NativeLibrary_find
 472   (JNIEnv *env, jobject this, jstring name)
 473 {
 474     jlong handle;
 475     const char *cname;
 476     jlong res;
 477 
 478     if (!initIDs(env))
 479         return jlong_zero;
 480 
 481     handle = (*env)->GetLongField(env, this, handleID);




 381     if (cname == 0)
 382         return;
 383     handle = isBuiltin ? procHandle : JVM_LoadLibrary(cname);
 384     if (handle) {
 385         JNI_OnLoad_t JNI_OnLoad;
 386         JNI_OnLoad = (JNI_OnLoad_t)findJniFunction(env, handle,
 387                                                isBuiltin ? cname : NULL,
 388                                                JNI_TRUE);
 389         if (JNI_OnLoad) {
 390             JavaVM *jvm;
 391             (*env)->GetJavaVM(env, &jvm);
 392             jniVersion = (*JNI_OnLoad)(jvm, NULL);
 393         } else {
 394             jniVersion = 0x00010001;
 395         }
 396 
 397         cause = (*env)->ExceptionOccurred(env);
 398         if (cause) {
 399             (*env)->ExceptionClear(env);
 400             (*env)->Throw(env, cause);
 401             if (!isBuiltin) {
 402                 JVM_UnloadLibrary(handle);
 403             }
 404             goto done;
 405         }
 406 
 407         if (!JVM_IsSupportedJNIVersion(jniVersion) ||
 408             (isBuiltin && jniVersion < JNI_VERSION_1_8)) {
 409             char msg[256];
 410             jio_snprintf(msg, sizeof(msg),
 411                          "unsupported JNI version 0x%08X required by %s",
 412                          jniVersion, cname);
 413             JNU_ThrowByName(env, "java/lang/UnsatisfiedLinkError", msg);
 414             if (!isBuiltin) {
 415                 JVM_UnloadLibrary(handle);
 416             }
 417             goto done;
 418         }
 419         (*env)->SetIntField(env, this, jniVersionID, jniVersion);
 420     } else {
 421         cause = (*env)->ExceptionOccurred(env);
 422         if (cause) {
 423             (*env)->ExceptionClear(env);
 424             (*env)->SetLongField(env, this, handleID, (jlong)0);
 425             (*env)->Throw(env, cause);
 426         }
 427         goto done;
 428     }
 429     (*env)->SetLongField(env, this, handleID, ptr_to_jlong(handle));
 430     (*env)->SetBooleanField(env, this, loadedID, JNI_TRUE);
 431 
 432  done:
 433     JNU_ReleaseStringPlatformChars(env, name, cname);
 434 }
 435 
 436 /*


 445     const char *onUnloadSymbols[] = JNI_ONUNLOAD_SYMBOLS;
 446     void *handle;
 447     JNI_OnUnload_t JNI_OnUnload;
 448      const char *cname;
 449 
 450     if (!initIDs(env))
 451         return;
 452     cname = JNU_GetStringPlatformChars(env, name, 0);
 453     if (cname == NULL) {
 454         return;
 455     }
 456     handle = jlong_to_ptr((*env)->GetLongField(env, this, handleID));
 457     JNI_OnUnload = (JNI_OnUnload_t )findJniFunction(env, handle,
 458                                                 isBuiltin ? cname : NULL,
 459                                                 JNI_FALSE);
 460     if (JNI_OnUnload) {
 461         JavaVM *jvm;
 462         (*env)->GetJavaVM(env, &jvm);
 463         (*JNI_OnUnload)(jvm, NULL);
 464     }
 465     if (!isBuiltin) {
 466         JVM_UnloadLibrary(handle);
 467     }
 468     JNU_ReleaseStringPlatformChars(env, name, cname);
 469 }
 470 
 471 /*
 472  * Class:     java_lang_ClassLoader_NativeLibrary
 473  * Method:    find
 474  * Signature: (Ljava/lang/String;)J
 475  */
 476 JNIEXPORT jlong JNICALL
 477 Java_java_lang_ClassLoader_00024NativeLibrary_find
 478   (JNIEnv *env, jobject this, jstring name)
 479 {
 480     jlong handle;
 481     const char *cname;
 482     jlong res;
 483 
 484     if (!initIDs(env))
 485         return jlong_zero;
 486 
 487     handle = (*env)->GetLongField(env, this, handleID);