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); |