< prev index next >

src/share/vm/prims/jni.cpp

Print this page




2457   HOTSPOT_JNI_GETSTRINGLENGTH_ENTRY(env, string);
2458   jsize ret = 0;
2459   oop s = JNIHandles::resolve_non_null(string);
2460   if (java_lang_String::value(s) != NULL) {
2461     ret = java_lang_String::length(s);
2462   }
2463  HOTSPOT_JNI_GETSTRINGLENGTH_RETURN(ret);
2464   return ret;
2465 JNI_END
2466 
2467 
2468 JNI_QUICK_ENTRY(const jchar*, jni_GetStringChars(
2469   JNIEnv *env, jstring string, jboolean *isCopy))
2470   JNIWrapper("GetStringChars");
2471  HOTSPOT_JNI_GETSTRINGCHARS_ENTRY(env, string, (uintptr_t *) isCopy);
2472   jchar* buf = NULL;
2473   oop s = JNIHandles::resolve_non_null(string);
2474   typeArrayOop s_value = java_lang_String::value(s);
2475   if (s_value != NULL) {
2476     int s_len = java_lang_String::length(s);
2477     int s_offset = java_lang_String::offset(s);
2478     buf = NEW_C_HEAP_ARRAY_RETURN_NULL(jchar, s_len + 1, mtInternal);  // add one for zero termination
2479     /* JNI Specification states return NULL on OOM */
2480     if (buf != NULL) {
2481       if (s_len > 0) {
2482         memcpy(buf, s_value->char_at_addr(s_offset), sizeof(jchar)*s_len);






2483       }
2484       buf[s_len] = 0;
2485       //%note jni_5
2486       if (isCopy != NULL) {
2487         *isCopy = JNI_TRUE;
2488       }
2489     }
2490   }
2491   HOTSPOT_JNI_GETSTRINGCHARS_RETURN(buf);
2492   return buf;
2493 JNI_END
2494 
2495 
2496 JNI_QUICK_ENTRY(void, jni_ReleaseStringChars(JNIEnv *env, jstring str, const jchar *chars))
2497   JNIWrapper("ReleaseStringChars");
2498   HOTSPOT_JNI_RELEASESTRINGCHARS_ENTRY(env, str, (uint16_t *) chars);
2499   //%note jni_6
2500   if (chars != NULL) {
2501     // Since String objects are supposed to be immutable, don't copy any
2502     // new data back.  A bad user will have to go after the char array.


3101   return ret;
3102 JNI_END
3103 
3104 //
3105 // Extensions
3106 //
3107 
3108 DT_VOID_RETURN_MARK_DECL(GetStringRegion
3109                          , HOTSPOT_JNI_GETSTRINGREGION_RETURN());
3110 
3111 JNI_ENTRY(void, jni_GetStringRegion(JNIEnv *env, jstring string, jsize start, jsize len, jchar *buf))
3112   JNIWrapper("GetStringRegion");
3113  HOTSPOT_JNI_GETSTRINGREGION_ENTRY(env, string, start, len, buf);
3114   DT_VOID_RETURN_MARK(GetStringRegion);
3115   oop s = JNIHandles::resolve_non_null(string);
3116   int s_len = java_lang_String::length(s);
3117   if (start < 0 || len < 0 || start + len > s_len) {
3118     THROW(vmSymbols::java_lang_StringIndexOutOfBoundsException());
3119   } else {
3120     if (len > 0) {
3121       int s_offset = java_lang_String::offset(s);
3122       typeArrayOop s_value = java_lang_String::value(s);
3123       memcpy(buf, s_value->char_at_addr(s_offset+start), sizeof(jchar)*len);







3124     }
3125   }
3126 JNI_END
3127 
3128 DT_VOID_RETURN_MARK_DECL(GetStringUTFRegion
3129                          , HOTSPOT_JNI_GETSTRINGUTFREGION_RETURN());
3130 
3131 JNI_ENTRY(void, jni_GetStringUTFRegion(JNIEnv *env, jstring string, jsize start, jsize len, char *buf))
3132   JNIWrapper("GetStringUTFRegion");
3133  HOTSPOT_JNI_GETSTRINGUTFREGION_ENTRY(env, string, start, len, buf);
3134   DT_VOID_RETURN_MARK(GetStringUTFRegion);
3135   oop s = JNIHandles::resolve_non_null(string);
3136   int s_len = java_lang_String::length(s);
3137   if (start < 0 || len < 0 || start + len > s_len) {
3138     THROW(vmSymbols::java_lang_StringIndexOutOfBoundsException());
3139   } else {
3140     //%note jni_7
3141     if (len > 0) {
3142       // Assume the buffer is large enough as the JNI spec. does not require user error checking
3143       java_lang_String::as_utf8_string(s, start, len, buf, INT_MAX);


3169   }
3170   void* ret = arrayOop(a)->base(type);
3171  HOTSPOT_JNI_GETPRIMITIVEARRAYCRITICAL_RETURN(ret);
3172   return ret;
3173 JNI_END
3174 
3175 
3176 JNI_ENTRY(void, jni_ReleasePrimitiveArrayCritical(JNIEnv *env, jarray array, void *carray, jint mode))
3177   JNIWrapper("ReleasePrimitiveArrayCritical");
3178   HOTSPOT_JNI_RELEASEPRIMITIVEARRAYCRITICAL_ENTRY(env, array, carray, mode);
3179   // The array, carray and mode arguments are ignored
3180   GC_locker::unlock_critical(thread);
3181 HOTSPOT_JNI_RELEASEPRIMITIVEARRAYCRITICAL_RETURN();
3182 JNI_END
3183 
3184 
3185 JNI_ENTRY(const jchar*, jni_GetStringCritical(JNIEnv *env, jstring string, jboolean *isCopy))
3186   JNIWrapper("GetStringCritical");
3187   HOTSPOT_JNI_GETSTRINGCRITICAL_ENTRY(env, string, (uintptr_t *) isCopy);
3188   GC_locker::lock_critical(thread);
3189   if (isCopy != NULL) {
3190     *isCopy = JNI_FALSE;
3191   }
3192   oop s = JNIHandles::resolve_non_null(string);
3193   int s_len = java_lang_String::length(s);
3194   typeArrayOop s_value = java_lang_String::value(s);
3195   int s_offset = java_lang_String::offset(s);



3196   const jchar* ret;
3197   if (s_len > 0) {
3198     ret = s_value->char_at_addr(s_offset);
3199   } else {
3200     ret = (jchar*) s_value->base(T_CHAR);






3201   }
3202  HOTSPOT_JNI_GETSTRINGCRITICAL_RETURN((uint16_t *) ret);
3203   return ret;
3204 JNI_END
3205 
3206 
3207 JNI_ENTRY(void, jni_ReleaseStringCritical(JNIEnv *env, jstring str, const jchar *chars))
3208   JNIWrapper("ReleaseStringCritical");
3209   HOTSPOT_JNI_RELEASESTRINGCRITICAL_ENTRY(env, str, (uint16_t *) chars);
3210   // The str and chars arguments are ignored







3211   GC_locker::unlock_critical(thread);
3212 HOTSPOT_JNI_RELEASESTRINGCRITICAL_RETURN();
3213 JNI_END
3214 
3215 
3216 JNI_ENTRY(jweak, jni_NewWeakGlobalRef(JNIEnv *env, jobject ref))
3217   JNIWrapper("jni_NewWeakGlobalRef");
3218  HOTSPOT_JNI_NEWWEAKGLOBALREF_ENTRY(env, ref);
3219   Handle ref_handle(thread, JNIHandles::resolve(ref));
3220   jweak ret = JNIHandles::make_weak_global(ref_handle);
3221  HOTSPOT_JNI_NEWWEAKGLOBALREF_RETURN(ret);
3222   return ret;
3223 JNI_END
3224 
3225 // Must be JNI_ENTRY (with HandleMark)
3226 JNI_ENTRY(void, jni_DeleteWeakGlobalRef(JNIEnv *env, jweak ref))
3227   JNIWrapper("jni_DeleteWeakGlobalRef");
3228   HOTSPOT_JNI_DELETEWEAKGLOBALREF_ENTRY(env, ref);
3229   JNIHandles::destroy_weak_global(ref);
3230   HOTSPOT_JNI_DELETEWEAKGLOBALREF_RETURN();




2457   HOTSPOT_JNI_GETSTRINGLENGTH_ENTRY(env, string);
2458   jsize ret = 0;
2459   oop s = JNIHandles::resolve_non_null(string);
2460   if (java_lang_String::value(s) != NULL) {
2461     ret = java_lang_String::length(s);
2462   }
2463  HOTSPOT_JNI_GETSTRINGLENGTH_RETURN(ret);
2464   return ret;
2465 JNI_END
2466 
2467 
2468 JNI_QUICK_ENTRY(const jchar*, jni_GetStringChars(
2469   JNIEnv *env, jstring string, jboolean *isCopy))
2470   JNIWrapper("GetStringChars");
2471  HOTSPOT_JNI_GETSTRINGCHARS_ENTRY(env, string, (uintptr_t *) isCopy);
2472   jchar* buf = NULL;
2473   oop s = JNIHandles::resolve_non_null(string);
2474   typeArrayOop s_value = java_lang_String::value(s);
2475   if (s_value != NULL) {
2476     int s_len = java_lang_String::length(s);
2477     bool is_latin1 = java_lang_String::is_latin1(s);
2478     buf = NEW_C_HEAP_ARRAY_RETURN_NULL(jchar, s_len + 1, mtInternal);  // add one for zero termination
2479     /* JNI Specification states return NULL on OOM */
2480     if (buf != NULL) {
2481       if (s_len > 0) {
2482         if (!is_latin1) {
2483           memcpy(buf, s_value->char_at_addr(0), sizeof(jchar)*s_len);
2484         } else {
2485           for (int i = 0; i < s_len; i++) {
2486             buf[i] = ((jchar) s_value->byte_at(i)) & 0xff;
2487           }
2488         }
2489       }
2490       buf[s_len] = 0;
2491       //%note jni_5
2492       if (isCopy != NULL) {
2493         *isCopy = JNI_TRUE;
2494       }
2495     }
2496   }
2497   HOTSPOT_JNI_GETSTRINGCHARS_RETURN(buf);
2498   return buf;
2499 JNI_END
2500 
2501 
2502 JNI_QUICK_ENTRY(void, jni_ReleaseStringChars(JNIEnv *env, jstring str, const jchar *chars))
2503   JNIWrapper("ReleaseStringChars");
2504   HOTSPOT_JNI_RELEASESTRINGCHARS_ENTRY(env, str, (uint16_t *) chars);
2505   //%note jni_6
2506   if (chars != NULL) {
2507     // Since String objects are supposed to be immutable, don't copy any
2508     // new data back.  A bad user will have to go after the char array.


3107   return ret;
3108 JNI_END
3109 
3110 //
3111 // Extensions
3112 //
3113 
3114 DT_VOID_RETURN_MARK_DECL(GetStringRegion
3115                          , HOTSPOT_JNI_GETSTRINGREGION_RETURN());
3116 
3117 JNI_ENTRY(void, jni_GetStringRegion(JNIEnv *env, jstring string, jsize start, jsize len, jchar *buf))
3118   JNIWrapper("GetStringRegion");
3119  HOTSPOT_JNI_GETSTRINGREGION_ENTRY(env, string, start, len, buf);
3120   DT_VOID_RETURN_MARK(GetStringRegion);
3121   oop s = JNIHandles::resolve_non_null(string);
3122   int s_len = java_lang_String::length(s);
3123   if (start < 0 || len < 0 || start + len > s_len) {
3124     THROW(vmSymbols::java_lang_StringIndexOutOfBoundsException());
3125   } else {
3126     if (len > 0) {

3127       typeArrayOop s_value = java_lang_String::value(s);
3128       bool is_latin1 = java_lang_String::is_latin1(s);
3129       if (!is_latin1) {
3130         memcpy(buf, s_value->char_at_addr(start), sizeof(jchar)*len);
3131       } else {
3132         for (int i = 0; i < len; i++) {
3133           buf[i] = ((jchar) s_value->byte_at(i + start)) & 0xff;
3134         }
3135       }
3136     }
3137   }
3138 JNI_END
3139 
3140 DT_VOID_RETURN_MARK_DECL(GetStringUTFRegion
3141                          , HOTSPOT_JNI_GETSTRINGUTFREGION_RETURN());
3142 
3143 JNI_ENTRY(void, jni_GetStringUTFRegion(JNIEnv *env, jstring string, jsize start, jsize len, char *buf))
3144   JNIWrapper("GetStringUTFRegion");
3145  HOTSPOT_JNI_GETSTRINGUTFREGION_ENTRY(env, string, start, len, buf);
3146   DT_VOID_RETURN_MARK(GetStringUTFRegion);
3147   oop s = JNIHandles::resolve_non_null(string);
3148   int s_len = java_lang_String::length(s);
3149   if (start < 0 || len < 0 || start + len > s_len) {
3150     THROW(vmSymbols::java_lang_StringIndexOutOfBoundsException());
3151   } else {
3152     //%note jni_7
3153     if (len > 0) {
3154       // Assume the buffer is large enough as the JNI spec. does not require user error checking
3155       java_lang_String::as_utf8_string(s, start, len, buf, INT_MAX);


3181   }
3182   void* ret = arrayOop(a)->base(type);
3183  HOTSPOT_JNI_GETPRIMITIVEARRAYCRITICAL_RETURN(ret);
3184   return ret;
3185 JNI_END
3186 
3187 
3188 JNI_ENTRY(void, jni_ReleasePrimitiveArrayCritical(JNIEnv *env, jarray array, void *carray, jint mode))
3189   JNIWrapper("ReleasePrimitiveArrayCritical");
3190   HOTSPOT_JNI_RELEASEPRIMITIVEARRAYCRITICAL_ENTRY(env, array, carray, mode);
3191   // The array, carray and mode arguments are ignored
3192   GC_locker::unlock_critical(thread);
3193 HOTSPOT_JNI_RELEASEPRIMITIVEARRAYCRITICAL_RETURN();
3194 JNI_END
3195 
3196 
3197 JNI_ENTRY(const jchar*, jni_GetStringCritical(JNIEnv *env, jstring string, jboolean *isCopy))
3198   JNIWrapper("GetStringCritical");
3199   HOTSPOT_JNI_GETSTRINGCRITICAL_ENTRY(env, string, (uintptr_t *) isCopy);
3200   GC_locker::lock_critical(thread);



3201   oop s = JNIHandles::resolve_non_null(string);

3202   typeArrayOop s_value = java_lang_String::value(s);
3203   bool is_latin1 = java_lang_String::is_latin1(s);
3204   if (isCopy != NULL) {
3205     *isCopy = is_latin1 ? JNI_TRUE : JNI_FALSE;
3206   }
3207   const jchar* ret;
3208   if (!is_latin1) {
3209     ret = s_value->char_at_addr(0);
3210   } else {
3211     // Inflate latin1 encoded string to UTF16
3212     int s_len = java_lang_String::length(s);
3213     jchar* buf = NEW_C_HEAP_ARRAY(jchar, s_len, mtInternal);
3214     for (int i = 0; i < s_len; i++) {
3215       buf[i] = ((jchar) s_value->byte_at(i)) & 0xff;
3216     }
3217     ret = &buf[0];
3218   }
3219  HOTSPOT_JNI_GETSTRINGCRITICAL_RETURN((uint16_t *) ret);
3220   return ret;
3221 JNI_END
3222 
3223 
3224 JNI_ENTRY(void, jni_ReleaseStringCritical(JNIEnv *env, jstring str, const jchar *chars))
3225   JNIWrapper("ReleaseStringCritical");
3226   HOTSPOT_JNI_RELEASESTRINGCRITICAL_ENTRY(env, str, (uint16_t *) chars);
3227   // The str and chars arguments are ignored for UTF16 strings
3228   oop s = JNIHandles::resolve_non_null(str);
3229   bool is_latin1 = java_lang_String::is_latin1(s);
3230   if (is_latin1) {
3231     // For latin1 string, free jchar array allocated by earlier call to GetStringCritical.
3232     // This assumes that ReleaseStringCritical bookends GetStringCritical.
3233     FREE_C_HEAP_ARRAY(jchar, chars);
3234   }
3235   GC_locker::unlock_critical(thread);
3236 HOTSPOT_JNI_RELEASESTRINGCRITICAL_RETURN();
3237 JNI_END
3238 
3239 
3240 JNI_ENTRY(jweak, jni_NewWeakGlobalRef(JNIEnv *env, jobject ref))
3241   JNIWrapper("jni_NewWeakGlobalRef");
3242  HOTSPOT_JNI_NEWWEAKGLOBALREF_ENTRY(env, ref);
3243   Handle ref_handle(thread, JNIHandles::resolve(ref));
3244   jweak ret = JNIHandles::make_weak_global(ref_handle);
3245  HOTSPOT_JNI_NEWWEAKGLOBALREF_RETURN(ret);
3246   return ret;
3247 JNI_END
3248 
3249 // Must be JNI_ENTRY (with HandleMark)
3250 JNI_ENTRY(void, jni_DeleteWeakGlobalRef(JNIEnv *env, jweak ref))
3251   JNIWrapper("jni_DeleteWeakGlobalRef");
3252   HOTSPOT_JNI_DELETEWEAKGLOBALREF_ENTRY(env, ref);
3253   JNIHandles::destroy_weak_global(ref);
3254   HOTSPOT_JNI_DELETEWEAKGLOBALREF_RETURN();


< prev index next >