< prev index next >

src/hotspot/share/prims/jni.cpp

Print this page




3493   return CurrentVersion;
3494 JNI_END
3495 
3496 extern struct JavaVM_ main_vm;
3497 
3498 JNI_LEAF(jint, jni_GetJavaVM(JNIEnv *env, JavaVM **vm))
3499   JNIWrapper("jni_GetJavaVM");
3500   HOTSPOT_JNI_GETJAVAVM_ENTRY(env, (void **) vm);
3501   *vm  = (JavaVM *)(&main_vm);
3502   HOTSPOT_JNI_GETJAVAVM_RETURN(JNI_OK);
3503   return JNI_OK;
3504 JNI_END
3505 
3506 
3507 JNI_ENTRY(jobject, jni_GetModule(JNIEnv* env, jclass clazz))
3508   JNIWrapper("GetModule");
3509   return Modules::get_module(clazz, THREAD);
3510 JNI_END
3511 
3512 


























































































3513 // Structure containing all jni functions
3514 struct JNINativeInterface_ jni_NativeInterface = {
3515     NULL,
3516     NULL,
3517     NULL,
3518 
3519     NULL,
3520 
3521     jni_GetVersion,
3522 
3523     jni_DefineClass,
3524     jni_FindClass,
3525 
3526     jni_FromReflectedMethod,
3527     jni_FromReflectedField,
3528 
3529     jni_ToReflectedMethod,
3530 
3531     jni_GetSuperclass,
3532     jni_IsAssignableFrom,


3776     jni_ReleasePrimitiveArrayCritical,
3777 
3778     jni_GetStringCritical,
3779     jni_ReleaseStringCritical,
3780 
3781     jni_NewWeakGlobalRef,
3782     jni_DeleteWeakGlobalRef,
3783 
3784     jni_ExceptionCheck,
3785 
3786     jni_NewDirectByteBuffer,
3787     jni_GetDirectBufferAddress,
3788     jni_GetDirectBufferCapacity,
3789 
3790     // New 1_6 features
3791 
3792     jni_GetObjectRefType,
3793 
3794     // Module features
3795 
3796     jni_GetModule








3797 };
3798 
3799 
3800 // For jvmti use to modify jni function table.
3801 // Java threads in native contiues to run until it is transitioned
3802 // to VM at safepoint. Before the transition or before it is blocked
3803 // for safepoint it may access jni function table. VM could crash if
3804 // any java thread access the jni function table in the middle of memcpy.
3805 // To avoid this each function pointers are copied automically.
3806 void copy_jni_function_table(const struct JNINativeInterface_ *new_jni_NativeInterface) {
3807   assert(SafepointSynchronize::is_at_safepoint(), "must be at safepoint");
3808   intptr_t *a = (intptr_t *) jni_functions();
3809   intptr_t *b = (intptr_t *) new_jni_NativeInterface;
3810   for (uint i=0; i <  sizeof(struct JNINativeInterface_)/sizeof(void *); i++) {
3811     Atomic::store(*b++, a++);
3812   }
3813 }
3814 
3815 void quicken_jni_functions() {
3816   // Replace Get<Primitive>Field with fast versions




3493   return CurrentVersion;
3494 JNI_END
3495 
3496 extern struct JavaVM_ main_vm;
3497 
3498 JNI_LEAF(jint, jni_GetJavaVM(JNIEnv *env, JavaVM **vm))
3499   JNIWrapper("jni_GetJavaVM");
3500   HOTSPOT_JNI_GETJAVAVM_ENTRY(env, (void **) vm);
3501   *vm  = (JavaVM *)(&main_vm);
3502   HOTSPOT_JNI_GETJAVAVM_RETURN(JNI_OK);
3503   return JNI_OK;
3504 JNI_END
3505 
3506 
3507 JNI_ENTRY(jobject, jni_GetModule(JNIEnv* env, jclass clazz))
3508   JNIWrapper("GetModule");
3509   return Modules::get_module(clazz, THREAD);
3510 JNI_END
3511 
3512 
3513 JNI_ENTRY(void*, jni_GetFlattenedArrayElements(JNIEnv* env, jarray array, jboolean* isCopy))
3514   JNIWrapper("jni_GetFlattenedArrayElements");
3515   if (isCopy != NULL) {
3516     *isCopy = JNI_FALSE;
3517   }
3518   arrayOop ar = arrayOop(JNIHandles::resolve_non_null(array));
3519   if (!ar->is_array()) {
3520     THROW_MSG_NULL(vmSymbols::java_lang_IllegalArgumentException(), "Not an array");
3521   }
3522   if (!ar->is_valueArray()) {
3523     THROW_MSG_NULL(vmSymbols::java_lang_IllegalArgumentException(), "Not a flattened array");
3524   }
3525   ValueArrayKlass* vak = ValueArrayKlass::cast(ar->klass());
3526   if (vak->contains_oops()) {
3527     THROW_MSG_NULL(vmSymbols::java_lang_IllegalArgumentException(), "Flattened array contains oops");
3528   }
3529   oop a = lock_gc_or_pin_object(thread, array);
3530   valueArrayOop vap = valueArrayOop(a);
3531   void* ret = vap->value_at_addr(0, vak->layout_helper());
3532   return ret;
3533 JNI_END
3534 
3535 JNI_ENTRY(void, jni_ReleaseFlattenedArrayElements(JNIEnv* env, jarray array, void* elem, jint mode))
3536   JNIWrapper("jni_ReleaseFlattenedArrayElements");
3537   unlock_gc_or_unpin_object(thread, array);
3538 JNI_END
3539 
3540 JNI_ENTRY(jsize, jni_GetFlattenedArrayElementSize(JNIEnv* env, jarray array)) {
3541   JNIWrapper("jni_GetFlattenedElementSize");
3542   arrayOop a = arrayOop(JNIHandles::resolve_non_null(array));
3543   if (!a->is_array()) {
3544     THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "Not an array");
3545   }
3546   if (!a->is_valueArray()) {
3547     THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "Not a flattened array");
3548   }
3549   ValueArrayKlass* vak = ValueArrayKlass::cast(a->klass());
3550   jsize ret = vak->element_byte_size();
3551   return ret;
3552 }
3553 JNI_END
3554 
3555 JNI_ENTRY(jclass, jni_GetFlattenedArrayElementClass(JNIEnv* env, jarray array))
3556   JNIWrapper("jni_GetArrayElementClass");
3557   arrayOop a = arrayOop(JNIHandles::resolve_non_null(array));
3558   if (!a->is_array()) {
3559     THROW_MSG_NULL(vmSymbols::java_lang_IllegalArgumentException(), "Not an array");
3560   }
3561   if (!a->is_valueArray()) {
3562     THROW_MSG_NULL(vmSymbols::java_lang_IllegalArgumentException(), "Not a flattened array");
3563   }
3564   ValueArrayKlass* vak = ValueArrayKlass::cast(a->klass());
3565   ValueKlass* vk = vak->element_klass();
3566   return (jclass) JNIHandles::make_local(vk->java_mirror());
3567 JNI_END
3568 
3569 JNI_ENTRY(jsize, jni_GetFieldOffsetInFlattenedLayout(JNIEnv* env, jclass clazz, const char *name, const char *signature, jboolean* isFlattened))
3570   JNIWrapper("jni_GetFieldOffsetInFlattenedLayout");
3571 
3572   oop mirror = JNIHandles::resolve_non_null(clazz);
3573   Klass* k = java_lang_Class::as_Klass(mirror);
3574   if (!k->is_value()) {
3575     ResourceMark rm;
3576         THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), err_msg("%s has not flattened layout", k->external_name()));
3577   }
3578   ValueKlass* vk = ValueKlass::cast(k);
3579 
3580   TempNewSymbol fieldname = SymbolTable::probe(name, (int)strlen(name));
3581   TempNewSymbol signame = SymbolTable::probe(signature, (int)strlen(signature));
3582   if (fieldname == NULL || signame == NULL) {
3583     ResourceMark rm;
3584     THROW_MSG_0(vmSymbols::java_lang_NoSuchFieldError(), err_msg("%s.%s %s", vk->external_name(), name, signature));
3585   }
3586 
3587   assert(vk->is_initialized(), "If a flattened array has been created, the element klass must have been initialized");
3588 
3589   fieldDescriptor fd;
3590   if (!vk->is_instance_klass() ||
3591       !InstanceKlass::cast(vk)->find_field(fieldname, signame, false, &fd)) {
3592     ResourceMark rm;
3593     THROW_MSG_0(vmSymbols::java_lang_NoSuchFieldError(), err_msg("%s.%s %s", vk->external_name(), name, signature));
3594   }
3595 
3596   int offset = fd.offset() - vk->first_field_offset();
3597   if (isFlattened != NULL) {
3598     *isFlattened = fd.is_flattened();
3599   }
3600   return (jsize)offset;
3601 JNI_END
3602 
3603 // Structure containing all jni functions
3604 struct JNINativeInterface_ jni_NativeInterface = {
3605     NULL,
3606     NULL,
3607     NULL,
3608 
3609     NULL,
3610 
3611     jni_GetVersion,
3612 
3613     jni_DefineClass,
3614     jni_FindClass,
3615 
3616     jni_FromReflectedMethod,
3617     jni_FromReflectedField,
3618 
3619     jni_ToReflectedMethod,
3620 
3621     jni_GetSuperclass,
3622     jni_IsAssignableFrom,


3866     jni_ReleasePrimitiveArrayCritical,
3867 
3868     jni_GetStringCritical,
3869     jni_ReleaseStringCritical,
3870 
3871     jni_NewWeakGlobalRef,
3872     jni_DeleteWeakGlobalRef,
3873 
3874     jni_ExceptionCheck,
3875 
3876     jni_NewDirectByteBuffer,
3877     jni_GetDirectBufferAddress,
3878     jni_GetDirectBufferCapacity,
3879 
3880     // New 1_6 features
3881 
3882     jni_GetObjectRefType,
3883 
3884     // Module features
3885 
3886     jni_GetModule,
3887 
3888     // Flattened arrays features
3889 
3890     jni_GetFlattenedArrayElements,
3891     jni_ReleaseFlattenedArrayElements,
3892     jni_GetFlattenedArrayElementClass,
3893     jni_GetFlattenedArrayElementSize,
3894     jni_GetFieldOffsetInFlattenedLayout
3895 };
3896 
3897 
3898 // For jvmti use to modify jni function table.
3899 // Java threads in native contiues to run until it is transitioned
3900 // to VM at safepoint. Before the transition or before it is blocked
3901 // for safepoint it may access jni function table. VM could crash if
3902 // any java thread access the jni function table in the middle of memcpy.
3903 // To avoid this each function pointers are copied automically.
3904 void copy_jni_function_table(const struct JNINativeInterface_ *new_jni_NativeInterface) {
3905   assert(SafepointSynchronize::is_at_safepoint(), "must be at safepoint");
3906   intptr_t *a = (intptr_t *) jni_functions();
3907   intptr_t *b = (intptr_t *) new_jni_NativeInterface;
3908   for (uint i=0; i <  sizeof(struct JNINativeInterface_)/sizeof(void *); i++) {
3909     Atomic::store(*b++, a++);
3910   }
3911 }
3912 
3913 void quicken_jni_functions() {
3914   // Replace Get<Primitive>Field with fast versions


< prev index next >