You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by va...@apache.org on 2006/12/15 09:33:23 UTC

svn commit: r487483 [3/4] - in /harmony/enhanced/drlvm/trunk: build/make/targets/ vm/interpreter/src/ vm/jitrino/src/jet/ vm/port/src/lil/em64t/pim/ vm/port/src/lil/ia32/pim/ vm/port/src/lil/ipf/pim/ vm/tests/smoke/shutdown/ vm/vmcore/include/ vm/vmcor...

Modified: harmony/enhanced/drlvm/trunk/vm/vmcore/src/jni/jni_array.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/vmcore/src/jni/jni_array.cpp?view=diff&rev=487483&r1=487482&r2=487483
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/vmcore/src/jni/jni_array.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/vmcore/src/jni/jni_array.cpp Fri Dec 15 00:33:21 2006
@@ -38,7 +38,7 @@
 #include "jni_utils.h"
 #include "exceptions.h"
 
-jsize JNICALL GetArrayLength(JNIEnv * UNREF env,
+jsize JNICALL GetArrayLength(JNIEnv * UNREF jni_env,
                              jarray array)
 {
     TRACE2("jni", "GetArrayLength called");
@@ -53,7 +53,7 @@
 } //GetArrayLength
 
 
-jarray JNICALL NewObjectArray(JNIEnv * UNREF env,
+jarray JNICALL NewObjectArray(JNIEnv * jni_env,
                               jsize length,
                               jclass elementClass,
                               jobject initialElement)
@@ -61,6 +61,10 @@
     ASSERT_RAISE_AREA;
     TRACE2("jni", "NewObjectArray called");
     assert(hythread_is_suspend_enabled());
+    
+    Global_Env * vm_env = jni_get_vm_env(jni_env);
+    if (vm_env->IsVmShutdowning()) return NULL;
+
     ObjectHandle elem_handle = (ObjectHandle)initialElement;
 
     Class* clss = jclass_to_struct_Class(elementClass);
@@ -68,7 +72,7 @@
     Class *arr_clss = (Class *)class_get_array_of_class(clss);
 
     if(!arr_clss) {
-         return 0;
+        return NULL;
     }
 
     // esostrov: vm_new_vector() may throw an exception. Throwing (not rising) 
@@ -105,8 +109,8 @@
     // only if the elem is non-null.
     if (elem != NULL) {
         ManagedObject **elems = (ManagedObject **)get_vector_element_address_ref(vector, 0);
-        Global_Env *global_env = VM_Global_State::loader_env;
-        if (global_env->compress_references) {
+        Global_Env * vm_env = VM_Global_State::loader_env;
+        if (vm_env->compress_references) {
             COMPRESSED_REFERENCE elem_offset = compress_reference((ManagedObject *)elem);
             COMPRESSED_REFERENCE *compressed_elems = (COMPRESSED_REFERENCE *)elems;
             for (int i = 0; i < length; i++) {
@@ -128,21 +132,20 @@
 
 
 
-jobject JNICALL GetObjectArrayElement(JNIEnv *env, jobjectArray array, jsize index)
+jobject JNICALL GetObjectArrayElement(JNIEnv * jni_env, jobjectArray array, jsize index)
 {
     TRACE2("jni", "GetObjectArrayElement called");
     assert(hythread_is_suspend_enabled());
-    if (array == NULL) {
-        // This should not happen.
-        ASSERT(0, "Input parameter 'array' is NULL");
-        return 0;
-    }
+    assert(array);
+
+    Global_Env * vm_env = jni_get_vm_env(jni_env);
+    if (vm_env->IsVmShutdowning()) return NULL;
 
-    jsize length = GetArrayLength(env, array);
+    jsize length = GetArrayLength(jni_env, array);
     if ((index < 0) || (index >= length)) {
         char msg[20];
         sprintf(msg, "%d", index);
-        ThrowNew_Quick(env, "java/lang/ArrayIndexOutOfBoundsException", msg);
+        ThrowNew_Quick(jni_env, "java/lang/ArrayIndexOutOfBoundsException", msg);
         return 0;
     }
 
@@ -165,39 +168,38 @@
 
 
 
-void JNICALL SetObjectArrayElement(JNIEnv *env,
+void JNICALL SetObjectArrayElement(JNIEnv * jni_env,
                                    jobjectArray array,
                                    jsize index,
                                    jobject value)
 {
     TRACE2("jni", "SetObjectArrayElement called");
     assert(hythread_is_suspend_enabled());
-    if (array == NULL) {
-        // This should not happen.
-        ASSERT(0, "Input parameter 'array' is NULL");
-        return;
-    }
+    assert(array);
+
+    Global_Env * vm_env = jni_get_vm_env(jni_env);
+    if (vm_env->IsVmShutdowning()) return;
 
-    jsize length = GetArrayLength(env, array);
+    jsize length = GetArrayLength(jni_env, array);
     if ((index < 0) || (index >= length)) {
         char msg[20];
         sprintf(msg, "%d", index);
-        ThrowNew_Quick(env, "java/lang/ArrayIndexOutOfBoundsException", msg);
+        ThrowNew_Quick(jni_env, "java/lang/ArrayIndexOutOfBoundsException", msg);
         return;
     }
 
     if (value != NULL) {
-        jclass array_jclass = GetObjectClass(env, array);
-        jclass actual_element_jclass = GetObjectClass(env, value);
+        jclass array_jclass = GetObjectClass(jni_env, array);
+        jclass actual_element_jclass = GetObjectClass(jni_env, value);
         
         Class* array_class = jclass_to_struct_Class(array_jclass);
         Class* actual_element_class = jclass_to_struct_Class(actual_element_jclass);
 
-        DeleteLocalRef(env, array_jclass);
-        DeleteLocalRef(env, actual_element_jclass);
+        DeleteLocalRef(jni_env, array_jclass);
+        DeleteLocalRef(jni_env, actual_element_jclass);
 
         if (!actual_element_class->is_instanceof(array_class->get_array_element_class())) {
-            ThrowNew_Quick(env, "java/lang/ArrayStoreException", actual_element_class->get_name()->bytes);
+            ThrowNew_Quick(jni_env, "java/lang/ArrayStoreException", actual_element_class->get_name()->bytes);
             return;
         }
     }
@@ -227,12 +229,15 @@
 
 
 
-jbooleanArray JNICALL NewBooleanArray(JNIEnv * UNREF env, jsize length)
+jbooleanArray JNICALL NewBooleanArray(JNIEnv * jni_env, jsize length)
 {
     TRACE2("jni", "NewBooleanArray called");
     assert(hythread_is_suspend_enabled());
-    Class *clss = VM_Global_State::loader_env->ArrayOfBoolean_Class;
     
+    Global_Env * vm_env = jni_get_vm_env(jni_env);
+    if (vm_env->IsVmShutdowning()) return NULL;
+    
+    Class *clss = vm_env->ArrayOfBoolean_Class;    
     unsigned sz = clss->calculate_array_size(length);
     tmn_suspend_disable();       //---------------------------------v
     ObjectHandle h = oh_allocate_local_handle();
@@ -259,13 +264,15 @@
 
 
 
-jbyteArray JNICALL NewByteArray(JNIEnv * UNREF env, jsize length)
+jbyteArray JNICALL NewByteArray(JNIEnv * jni_env, jsize length)
 {
     TRACE2("jni", "NewByteArray called");
     assert(hythread_is_suspend_enabled());
-    Class *clss = VM_Global_State::loader_env->ArrayOfByte_Class;
-    assert(clss);
- 
+    
+    Global_Env * vm_env = jni_get_vm_env(jni_env);
+    if (vm_env->IsVmShutdowning()) return NULL;
+    
+    Class *clss = vm_env->ArrayOfByte_Class;
     unsigned sz = clss->calculate_array_size(length);
     tmn_suspend_disable();       //---------------------------------v
     ObjectHandle h = oh_allocate_local_handle();
@@ -292,12 +299,15 @@
 
 
 
-jcharArray JNICALL NewCharArray(JNIEnv * UNREF env, jsize length)
+jcharArray JNICALL NewCharArray(JNIEnv * jni_env, jsize length)
 {
     TRACE2("jni", "NewCharArray called");
     assert(hythread_is_suspend_enabled());
-    Class *clss = VM_Global_State::loader_env->ArrayOfChar_Class;
- 
+    
+    Global_Env * vm_env = jni_get_vm_env(jni_env);
+    if (vm_env->IsVmShutdowning()) return NULL;
+
+    Class *clss = vm_env->ArrayOfChar_Class;
     unsigned sz = clss->calculate_array_size(length);
     tmn_suspend_disable();       //---------------------------------v
     ObjectHandle h = oh_allocate_local_handle();
@@ -324,12 +334,15 @@
 
 
 
-jshortArray JNICALL NewShortArray(JNIEnv * UNREF env, jsize length)
+jshortArray JNICALL NewShortArray(JNIEnv * jni_env, jsize length)
 {
     TRACE2("jni", "NewShortArray called");
     assert(hythread_is_suspend_enabled());
-    Class *clss = VM_Global_State::loader_env->ArrayOfShort_Class;
- 
+    
+    Global_Env * vm_env = jni_get_vm_env(jni_env);
+    if (vm_env->IsVmShutdowning()) return NULL;
+    
+    Class *clss = vm_env->ArrayOfShort_Class; 
     unsigned sz = clss->calculate_array_size(length);
     tmn_suspend_disable();       //---------------------------------v
     ObjectHandle h = oh_allocate_local_handle();
@@ -357,11 +370,15 @@
 
 
 
-jintArray JNICALL NewIntArray(JNIEnv * UNREF env, jsize length)
+jintArray JNICALL NewIntArray(JNIEnv * jni_env, jsize length)
 {
     TRACE2("jni", "NewIntArray called");
     assert(hythread_is_suspend_enabled());
-    Class *clss = VM_Global_State::loader_env->ArrayOfInt_Class;
+    
+    Global_Env * vm_env = jni_get_vm_env(jni_env);
+    if (vm_env->IsVmShutdowning()) return NULL;
+    
+    Class *clss = vm_env->ArrayOfInt_Class;
     unsigned sz = clss->calculate_array_size(length);
     tmn_suspend_disable();       //---------------------------------v
     ObjectHandle h = oh_allocate_local_handle();
@@ -388,11 +405,15 @@
 
 
 
-jlongArray JNICALL NewLongArray(JNIEnv * UNREF env, jsize length)
+jlongArray JNICALL NewLongArray(JNIEnv * jni_env, jsize length)
 {
     TRACE2("jni", "NewLongArray called");
     assert(hythread_is_suspend_enabled());
-    Class *clss = VM_Global_State::loader_env->ArrayOfLong_Class;
+    
+    Global_Env * vm_env = jni_get_vm_env(jni_env);
+    if (vm_env->IsVmShutdowning()) return NULL;
+
+    Class *clss = vm_env->ArrayOfLong_Class;
     unsigned sz = clss->calculate_array_size(length);
     tmn_suspend_disable();       //---------------------------------v
     ObjectHandle h = oh_allocate_local_handle();
@@ -419,11 +440,15 @@
 
 
 
-jfloatArray JNICALL NewFloatArray(JNIEnv * UNREF env, jsize length)
+jfloatArray JNICALL NewFloatArray(JNIEnv * jni_env, jsize length)
 {
     TRACE2("jni", "NewFloatArray called");
     assert(hythread_is_suspend_enabled());
-    Class *clss = VM_Global_State::loader_env->ArrayOfFloat_Class;
+    
+    Global_Env * vm_env = jni_get_vm_env(jni_env);
+    if (vm_env->IsVmShutdowning()) return NULL;
+    
+    Class *clss = vm_env->ArrayOfFloat_Class;
     unsigned sz = clss->calculate_array_size(length);
     tmn_suspend_disable();       //---------------------------------v
     ObjectHandle h = oh_allocate_local_handle();
@@ -450,11 +475,15 @@
 
 
 
-jdoubleArray JNICALL NewDoubleArray(JNIEnv * UNREF env, jsize length)
+jdoubleArray JNICALL NewDoubleArray(JNIEnv * jni_env, jsize length)
 {
     TRACE2("jni", "NewDoubleArray called");
     assert(hythread_is_suspend_enabled());
-    Class *clss = VM_Global_State::loader_env->ArrayOfDouble_Class;
+    
+    Global_Env * vm_env = jni_get_vm_env(jni_env);
+    if (vm_env->IsVmShutdowning()) return NULL;
+    
+    Class *clss = vm_env->ArrayOfDouble_Class;
     unsigned sz = clss->calculate_array_size(length);
     tmn_suspend_disable();       //---------------------------------v
     ObjectHandle h = oh_allocate_local_handle();
@@ -489,12 +518,16 @@
 // begin Get<Type>ArrayElements functions
 
 
-jboolean *JNICALL GetBooleanArrayElements(JNIEnv * UNREF env,
+jboolean *JNICALL GetBooleanArrayElements(JNIEnv * jni_env,
                                           jbooleanArray array,
                                           jboolean *isCopy)
 {
     TRACE2("jni", "GetBooleanArrayElements called");
     assert(hythread_is_suspend_enabled());
+    
+    Global_Env * vm_env = jni_get_vm_env(jni_env);
+    if (vm_env->IsVmShutdowning()) return NULL;
+
     ObjectHandle h = (ObjectHandle)array;
 
     tmn_suspend_disable();       //---------------------------------v
@@ -529,12 +562,16 @@
 
 
 
-jbyte *JNICALL GetByteArrayElements(JNIEnv * UNREF env,
+jbyte *JNICALL GetByteArrayElements(JNIEnv * jni_env,
                                     jbyteArray array,
                                     jboolean *isCopy)
 {
     TRACE2("jni", "GetByteArrayElements called");
     assert(hythread_is_suspend_enabled());
+
+    Global_Env * vm_env = jni_get_vm_env(jni_env);
+    if (vm_env->IsVmShutdowning()) return NULL;
+
     ObjectHandle h = (ObjectHandle)array;
 
     tmn_suspend_disable();       //---------------------------------v
@@ -569,12 +606,16 @@
 
 
 
-jchar *JNICALL GetCharArrayElements(JNIEnv * UNREF env,
+jchar *JNICALL GetCharArrayElements(JNIEnv * jni_env,
                                     jcharArray array,
                                     jboolean *isCopy)
 {
     TRACE2("jni", "GetCharArrayElements called");
     assert(hythread_is_suspend_enabled());
+
+    Global_Env * vm_env = jni_get_vm_env(jni_env);
+    if (vm_env->IsVmShutdowning()) return NULL;
+
     ObjectHandle h = (ObjectHandle)array;
 
     tmn_suspend_disable();       //---------------------------------v
@@ -609,12 +650,16 @@
 
 
 
-jshort *JNICALL GetShortArrayElements(JNIEnv * UNREF env,
+jshort *JNICALL GetShortArrayElements(JNIEnv * jni_env,
                                       jshortArray array,
                                       jboolean *isCopy)
 {
     TRACE2("jni", "GetShortArrayElements called");
     assert(hythread_is_suspend_enabled());
+
+    Global_Env * vm_env = jni_get_vm_env(jni_env);
+    if (vm_env->IsVmShutdowning()) return NULL;
+
     ObjectHandle h = (ObjectHandle)array;
 
     tmn_suspend_disable();       //---------------------------------v
@@ -649,12 +694,16 @@
 
 
 
-jint *JNICALL GetIntArrayElements(JNIEnv *env,
+jint *JNICALL GetIntArrayElements(JNIEnv * jni_env,
                                   jintArray array,
                                   jboolean *isCopy)
 {
     TRACE2("jni", "GetIntArrayElements called");
     assert(hythread_is_suspend_enabled());
+
+    Global_Env * vm_env = jni_get_vm_env(jni_env);
+    if (vm_env->IsVmShutdowning()) return NULL;
+
     ObjectHandle h = (ObjectHandle)array;
 
     tmn_suspend_disable();       //---------------------------------v
@@ -670,7 +719,7 @@
         Vector_Handle java_array = (Vector_Handle)h->object;
         return (jint *)get_vector_element_address_int32(java_array, 0);
     } else {
-        jsize length = GetArrayLength(env, array);
+        jsize length = GetArrayLength(jni_env, array);
 
         jint *primitive_array = (jint *)STD_MALLOC(sizeof(jint) * length);
 
@@ -690,12 +739,16 @@
 
 
 
-jlong *JNICALL GetLongArrayElements(JNIEnv * UNREF env,
+jlong *JNICALL GetLongArrayElements(JNIEnv * jni_env,
                                     jlongArray array,
                                     jboolean *isCopy)
 {
     TRACE2("jni", "GetLongArrayElements called");
     assert(hythread_is_suspend_enabled());
+
+    Global_Env * vm_env = jni_get_vm_env(jni_env);
+    if (vm_env->IsVmShutdowning()) return NULL;
+
     ObjectHandle h = (ObjectHandle)array;
 
     tmn_suspend_disable();       //---------------------------------v
@@ -730,12 +783,16 @@
 
 
 
-jfloat *JNICALL GetFloatArrayElements(JNIEnv *env,
+jfloat *JNICALL GetFloatArrayElements(JNIEnv * jni_env,
                                       jfloatArray array,
                                       jboolean *isCopy)
 {
     TRACE2("jni", "GetFloatArrayElements called");
     assert(hythread_is_suspend_enabled());
+
+    Global_Env * vm_env = jni_get_vm_env(jni_env);
+    if (vm_env->IsVmShutdowning()) return NULL;
+
     ObjectHandle h = (ObjectHandle)array;
 
     tmn_suspend_disable();       //---------------------------------v
@@ -751,7 +808,7 @@
         Vector_Handle java_array = (Vector_Handle)h->object;
         return (jfloat *)get_vector_element_address_f32(java_array, 0);
     } else {
-        jsize length = GetArrayLength(env, array);
+        jsize length = GetArrayLength(jni_env, array);
 
         jfloat *primitive_array = (jfloat *)STD_MALLOC(sizeof(jfloat) * length);
 
@@ -771,12 +828,16 @@
 
 
 
-jdouble *JNICALL GetDoubleArrayElements(JNIEnv * UNREF env,
+jdouble *JNICALL GetDoubleArrayElements(JNIEnv * jni_env,
                                         jdoubleArray array,
                                         jboolean *isCopy)
 {
     TRACE2("jni", "GetDoubleArrayElements called");
     assert(hythread_is_suspend_enabled());
+
+    Global_Env * vm_env = jni_get_vm_env(jni_env);
+    if (vm_env->IsVmShutdowning()) return NULL;
+
     ObjectHandle h = (ObjectHandle)array;
 
     tmn_suspend_disable();       //---------------------------------v
@@ -820,7 +881,7 @@
 // begin Release<Type>ArrayElements functions
 
 
-void JNICALL ReleaseBooleanArrayElements(JNIEnv *env,
+void JNICALL ReleaseBooleanArrayElements(JNIEnv * jni_env,
                                          jbooleanArray array,
                                          jboolean *elems,
                                          jint mode)
@@ -828,6 +889,10 @@
     TRACE2("jni", "ReleaseBooleanArrayElements called");
     assert(hythread_is_suspend_enabled());
     ObjectHandle h = (ObjectHandle)array;
+
+    // It is better to be user frendly and don't crash if nothing should be released.
+    if (elems == NULL) return;
+
     tmn_suspend_disable();       //---------------------------------v
 
     Vector_Handle java_array = (Vector_Handle)h->object;
@@ -845,7 +910,7 @@
     case 0:
     case JNI_COMMIT:
         {
-            jsize length = GetArrayLength(env, array);
+            jsize length = GetArrayLength(jni_env, array);
             tmn_suspend_disable();       //---------------------------------v
 
             Vector_Handle java_array = (Vector_Handle)h->object;
@@ -870,7 +935,7 @@
 
 
 
-void JNICALL ReleaseByteArrayElements(JNIEnv *env,
+void JNICALL ReleaseByteArrayElements(JNIEnv * jni_env,
                                       jbyteArray array,
                                       jbyte *elems,
                                       jint mode)
@@ -879,6 +944,9 @@
     assert(hythread_is_suspend_enabled());
     ObjectHandle h = (ObjectHandle)array;
 
+    // It is better to be user frendly and don't crash if nothing should be released.
+    if (elems == NULL) return;
+
     tmn_suspend_disable();       //---------------------------------v
 
     Vector_Handle java_array = (Vector_Handle)h->object;
@@ -896,7 +964,7 @@
     case 0:
     case JNI_COMMIT:
         {
-            jsize length = GetArrayLength(env, array);
+            jsize length = GetArrayLength(jni_env, array);
             tmn_suspend_disable();       //---------------------------------v
 
             Vector_Handle java_array = (Vector_Handle)h->object;
@@ -920,7 +988,7 @@
 
 
 
-void JNICALL ReleaseCharArrayElements(JNIEnv *env,
+void JNICALL ReleaseCharArrayElements(JNIEnv * jni_env,
                                       jcharArray array,
                                       jchar *elems,
                                       jint mode)
@@ -928,6 +996,10 @@
     TRACE2("jni", "ReleaseCharArrayElements called");
     assert(hythread_is_suspend_enabled());
     ObjectHandle h = (ObjectHandle)array;
+
+    // It is better to be user frendly and don't crash if nothing should be released.
+    if (elems == NULL) return;
+
     tmn_suspend_disable();       //---------------------------------v
 
     Vector_Handle java_array = (Vector_Handle)h->object;
@@ -945,7 +1017,7 @@
     case 0:
     case JNI_COMMIT:
         {
-            jsize length = GetArrayLength(env, array);
+            jsize length = GetArrayLength(jni_env, array);
             ObjectHandle h = (ObjectHandle)array;
             tmn_suspend_disable();       //---------------------------------v
 
@@ -970,7 +1042,7 @@
 
 
 
-void JNICALL ReleaseShortArrayElements(JNIEnv *env,
+void JNICALL ReleaseShortArrayElements(JNIEnv * jni_env,
                                        jshortArray array,
                                        jshort *elems,
                                        jint mode)
@@ -978,6 +1050,10 @@
     TRACE2("jni", "ReleaseShortArrayElements called");
     assert(hythread_is_suspend_enabled());
     ObjectHandle h = (ObjectHandle)array;
+ 
+    // It is better to be user frendly and don't crash if nothing should be released.
+    if (elems == NULL) return;
+    
     tmn_suspend_disable();       //---------------------------------v
 
     Vector_Handle java_array = (Vector_Handle)h->object;
@@ -995,7 +1071,7 @@
     case 0:
     case JNI_COMMIT:
         {
-            jsize length = GetArrayLength(env, array);
+            jsize length = GetArrayLength(jni_env, array);
             ObjectHandle h = (ObjectHandle)array;
             tmn_suspend_disable();       //---------------------------------v
 
@@ -1020,7 +1096,7 @@
 
 
 
-void JNICALL ReleaseIntArrayElements(JNIEnv *env,
+void JNICALL ReleaseIntArrayElements(JNIEnv * jni_env,
                                      jintArray array,
                                      jint *elems,
                                      jint mode)
@@ -1028,6 +1104,10 @@
     TRACE2("jni", "ReleaseIntArrayElements called");
     assert(hythread_is_suspend_enabled());
     ObjectHandle h = (ObjectHandle)array;
+
+    // It is better to be user frendly and don't crash if nothing should be released.
+    if (elems == NULL) return;
+
     tmn_suspend_disable();       //---------------------------------v
 
     Vector_Handle java_array = (Vector_Handle)h->object;
@@ -1045,7 +1125,7 @@
     case 0:
     case JNI_COMMIT:
         {
-            jsize length = GetArrayLength(env, array);
+            jsize length = GetArrayLength(jni_env, array);
             ObjectHandle h = (ObjectHandle)array;
             tmn_suspend_disable();       //---------------------------------v
 
@@ -1070,7 +1150,7 @@
 
 
 
-void JNICALL ReleaseLongArrayElements(JNIEnv *env,
+void JNICALL ReleaseLongArrayElements(JNIEnv * jni_env,
                                       jlongArray array,
                                       jlong *elems,
                                       jint mode)
@@ -1078,6 +1158,10 @@
     TRACE2("jni", "ReleaseLongArrayElements called");
     assert(hythread_is_suspend_enabled());
     ObjectHandle h = (ObjectHandle)array;
+
+    // It is better to be user frendly and don't crash if nothing should be released.
+    if (elems == NULL) return;
+
     tmn_suspend_disable();       //---------------------------------v
 
     Vector_Handle java_array = (Vector_Handle)h->object;
@@ -1095,7 +1179,7 @@
     case 0:
     case JNI_COMMIT:
         {
-            jsize length = GetArrayLength(env, array);
+            jsize length = GetArrayLength(jni_env, array);
             ObjectHandle h = (ObjectHandle)array;
             tmn_suspend_disable();       //---------------------------------v
 
@@ -1120,7 +1204,7 @@
 
 
 
-void JNICALL ReleaseFloatArrayElements(JNIEnv *env,
+void JNICALL ReleaseFloatArrayElements(JNIEnv * jni_env,
                                        jfloatArray array,
                                        jfloat *elems,
                                        jint mode)
@@ -1128,6 +1212,10 @@
     TRACE2("jni", "ReleaseFloatArrayElements called");
     assert(hythread_is_suspend_enabled());
     ObjectHandle h = (ObjectHandle)array;
+
+    // It is better to be user frendly and don't crash if nothing should be released.
+    if (elems == NULL) return;
+
     tmn_suspend_disable();       //---------------------------------v
 
     Vector_Handle java_array = (Vector_Handle)h->object;
@@ -1145,7 +1233,7 @@
     case 0:
     case JNI_COMMIT:
         {
-            jsize length = GetArrayLength(env, array);
+            jsize length = GetArrayLength(jni_env, array);
             ObjectHandle h = (ObjectHandle)array;
             tmn_suspend_disable();       //---------------------------------v
 
@@ -1171,7 +1259,7 @@
 
 
 
-void JNICALL ReleaseDoubleArrayElements(JNIEnv *env,
+void JNICALL ReleaseDoubleArrayElements(JNIEnv * jni_env,
                                         jdoubleArray array,
                                         jdouble *elems,
                                         jint mode)
@@ -1179,6 +1267,10 @@
     TRACE2("jni", "ReleaseDoubleArrayElements called");
     assert(hythread_is_suspend_enabled());
     ObjectHandle h = (ObjectHandle)array;
+
+    // It is better to be user frendly and don't crash if nothing should be released.
+    if (elems == NULL) return;
+
     tmn_suspend_disable();       //---------------------------------v
 
     Vector_Handle java_array = (Vector_Handle)h->object;
@@ -1196,7 +1288,7 @@
     case 0:
     case JNI_COMMIT:
         {
-            jsize length = GetArrayLength(env, array);
+            jsize length = GetArrayLength(jni_env, array);
             ObjectHandle h = (ObjectHandle)array;
             tmn_suspend_disable();       //---------------------------------v
 
@@ -1230,7 +1322,7 @@
 // begin Get<Type>ArrayRegion functions
 
 
-void JNICALL GetBooleanArrayRegion (JNIEnv *env,
+void JNICALL GetBooleanArrayRegion (JNIEnv * jni_env,
                                     jobjectArray array,
                                     jsize start,
                                     jsize len,
@@ -1238,12 +1330,16 @@
 {
     TRACE2("jni", "GetBooleanArrayRegion called");
     assert(hythread_is_suspend_enabled());
-    jsize length = GetArrayLength(env, array);
+    
+    Global_Env * vm_env = jni_get_vm_env(jni_env);
+    if (vm_env->IsVmShutdowning()) return;
+
+    jsize length = GetArrayLength(jni_env, array);
     jsize end = start + len;
     if(start < 0 || len < 0 || end > length) {
         char msg[30];
         sprintf(msg, "%d..%d", start, end);
-        ThrowNew_Quick(env, "java/lang/ArrayIndexOutOfBoundsException", msg);
+        ThrowNew_Quick(jni_env, "java/lang/ArrayIndexOutOfBoundsException", msg);
         return;
     }
 
@@ -1259,7 +1355,7 @@
 
 
 
-void JNICALL GetByteArrayRegion    (JNIEnv *env,
+void JNICALL GetByteArrayRegion    (JNIEnv * jni_env,
                                     jobjectArray array,
                                     jsize start,
                                     jsize len,
@@ -1267,12 +1363,16 @@
 {
     TRACE2("jni", "GetByteArrayRegion called");
     assert(hythread_is_suspend_enabled());
-    jsize length = GetArrayLength(env, array);
+
+    Global_Env * vm_env = jni_get_vm_env(jni_env);
+    if (vm_env->IsVmShutdowning()) return;
+
+    jsize length = GetArrayLength(jni_env, array);
     jsize end = start + len;
     if(start < 0 || len < 0 || end > length) {
         char msg[30];
         sprintf(msg, "%d..%d", start, end);
-        ThrowNew_Quick(env, "java/lang/ArrayIndexOutOfBoundsException", msg);
+        ThrowNew_Quick(jni_env, "java/lang/ArrayIndexOutOfBoundsException", msg);
         return;
     }
 
@@ -1288,7 +1388,7 @@
 
 
 
-void JNICALL GetCharArrayRegion(JNIEnv *env,
+void JNICALL GetCharArrayRegion(JNIEnv * jni_env,
                                 jobjectArray array,
                                 jsize start,
                                 jsize len,
@@ -1296,12 +1396,16 @@
 {
     TRACE2("jni", "GetCharArrayRegion called");
     assert(hythread_is_suspend_enabled());
-    jsize length = GetArrayLength(env, array);
+
+    Global_Env * vm_env = jni_get_vm_env(jni_env);
+    if (vm_env->IsVmShutdowning()) return;
+
+    jsize length = GetArrayLength(jni_env, array);
     jsize end = start + len;
     if(start < 0 || len < 0 || end > length) {
         char msg[30];
         sprintf(msg, "%d..%d", start, end);
-        ThrowNew_Quick(env, "java/lang/ArrayIndexOutOfBoundsException", msg);
+        ThrowNew_Quick(jni_env, "java/lang/ArrayIndexOutOfBoundsException", msg);
         return;
     }
 
@@ -1317,7 +1421,7 @@
 
 
 
-void JNICALL GetShortArrayRegion(JNIEnv *env,
+void JNICALL GetShortArrayRegion(JNIEnv * jni_env,
                                  jobjectArray array, 
                                  jsize start,
                                  jsize len,
@@ -1325,12 +1429,16 @@
 {
     TRACE2("jni", "GetShortArrayRegion called");
     assert(hythread_is_suspend_enabled());
-    jsize length = GetArrayLength(env, array);
+
+    Global_Env * vm_env = jni_get_vm_env(jni_env);
+    if (vm_env->IsVmShutdowning()) return;
+
+    jsize length = GetArrayLength(jni_env, array);
     jsize end = start + len;
     if(start < 0 || len < 0 || end > length) {
         char msg[30];
         sprintf(msg, "%d..%d", start, end);
-        ThrowNew_Quick(env, "java/lang/ArrayIndexOutOfBoundsException", msg);
+        ThrowNew_Quick(jni_env, "java/lang/ArrayIndexOutOfBoundsException", msg);
         return;
     }
 
@@ -1346,7 +1454,7 @@
 
 
 
-void JNICALL GetIntArrayRegion(JNIEnv *env,
+void JNICALL GetIntArrayRegion(JNIEnv * jni_env,
                                jobjectArray array,
                                jsize start,
                                jsize len,
@@ -1354,12 +1462,16 @@
 {
     TRACE2("jni", "GetIntArrayRegion called");
     assert(hythread_is_suspend_enabled());
-    jsize length = GetArrayLength(env, array);
+
+    Global_Env * vm_env = jni_get_vm_env(jni_env);
+    if (vm_env->IsVmShutdowning()) return;
+
+    jsize length = GetArrayLength(jni_env, array);
     jsize end = start + len;
     if(start < 0 || len < 0 || end > length) {
         char msg[30];
         sprintf(msg, "%d..%d", start, end);
-        ThrowNew_Quick(env, "java/lang/ArrayIndexOutOfBoundsException", msg);
+        ThrowNew_Quick(jni_env, "java/lang/ArrayIndexOutOfBoundsException", msg);
         return;
     }
 
@@ -1375,7 +1487,7 @@
 
 
 
-void JNICALL GetLongArrayRegion(JNIEnv *env,
+void JNICALL GetLongArrayRegion(JNIEnv * jni_env,
                                 jobjectArray array,
                                 jsize start,
                                 jsize len,
@@ -1383,12 +1495,16 @@
 {
     TRACE2("jni", "GetLongArrayRegion called");
     assert(hythread_is_suspend_enabled());
-    jsize length = GetArrayLength(env, array);
+
+    Global_Env * vm_env = jni_get_vm_env(jni_env);
+    if (vm_env->IsVmShutdowning()) return;
+
+    jsize length = GetArrayLength(jni_env, array);
     jsize end = start + len;
     if(start < 0 || len < 0 || end > length) {
         char msg[30];
         sprintf(msg, "%d..%d", start, end);
-        ThrowNew_Quick(env, "java/lang/ArrayIndexOutOfBoundsException", msg);
+        ThrowNew_Quick(jni_env, "java/lang/ArrayIndexOutOfBoundsException", msg);
         return;
     }
 
@@ -1404,7 +1520,7 @@
 
 
 
-void JNICALL GetFloatArrayRegion(JNIEnv *env,
+void JNICALL GetFloatArrayRegion(JNIEnv * jni_env,
                                  jobjectArray array,
                                  jsize start,
                                  jsize len,
@@ -1412,12 +1528,16 @@
 {
     TRACE2("jni", "GetFloatArrayRegion called");
     assert(hythread_is_suspend_enabled());
-    jsize length = GetArrayLength(env, array);
+
+    Global_Env * vm_env = jni_get_vm_env(jni_env);
+    if (vm_env->IsVmShutdowning()) return;
+
+    jsize length = GetArrayLength(jni_env, array);
     jsize end = start + len;
     if(start < 0 || len < 0 || end > length) {
         char msg[30];
         sprintf(msg, "%d..%d", start, end);
-        ThrowNew_Quick(env, "java/lang/ArrayIndexOutOfBoundsException", msg);
+        ThrowNew_Quick(jni_env, "java/lang/ArrayIndexOutOfBoundsException", msg);
         return;
     }
 
@@ -1433,7 +1553,7 @@
 
 
 
-void JNICALL GetDoubleArrayRegion(JNIEnv *env,
+void JNICALL GetDoubleArrayRegion(JNIEnv * jni_env,
                                   jobjectArray array,
                                   jsize start,
                                   jsize len,
@@ -1441,12 +1561,16 @@
 {
     TRACE2("jni", "GetDoubleArrayRegion called");
     assert(hythread_is_suspend_enabled());
-    jsize length = GetArrayLength(env, array);
+
+    Global_Env * vm_env = jni_get_vm_env(jni_env);
+    if (vm_env->IsVmShutdowning()) return;
+
+    jsize length = GetArrayLength(jni_env, array);
     jsize end = start + len;
     if(start < 0 || len < 0 || end > length) {
         char msg[30];
         sprintf(msg, "%d..%d", start, end);
-        ThrowNew_Quick(env, "java/lang/ArrayIndexOutOfBoundsException", msg);
+        ThrowNew_Quick(jni_env, "java/lang/ArrayIndexOutOfBoundsException", msg);
         return;
     }
 
@@ -1470,7 +1594,7 @@
 // begin Set<Type>ArrayRegion functions
 
 
-void JNICALL SetBooleanArrayRegion(JNIEnv *env,
+void JNICALL SetBooleanArrayRegion(JNIEnv * jni_env,
                                    jobjectArray array,
                                    jsize start,
                                    jsize len,
@@ -1478,12 +1602,16 @@
 {
     TRACE2("jni", "SetBooleanArrayRegion called");
     assert(hythread_is_suspend_enabled());
-    jsize length = GetArrayLength(env, array);
+
+    Global_Env * vm_env = jni_get_vm_env(jni_env);
+    if (vm_env->IsVmShutdowning()) return;
+
+    jsize length = GetArrayLength(jni_env, array);
     jsize end = start + len;
     if(start < 0 || len < 0 || end > length) {
         char msg[30];
         sprintf(msg, "%d..%d", start, end);
-        ThrowNew_Quick(env, "java/lang/ArrayIndexOutOfBoundsException", msg);
+        ThrowNew_Quick(jni_env, "java/lang/ArrayIndexOutOfBoundsException", msg);
         return;
     }
 
@@ -1501,7 +1629,7 @@
 
 
 
-void JNICALL SetByteArrayRegion(JNIEnv *env,
+void JNICALL SetByteArrayRegion(JNIEnv * jni_env,
                                 jobjectArray array,
                                 jsize start,
                                 jsize len,
@@ -1509,12 +1637,16 @@
 {
     TRACE2("jni", "SetByteArrayRegion called");
     assert(hythread_is_suspend_enabled());
-    jsize length = GetArrayLength(env, array);
+
+    Global_Env * vm_env = jni_get_vm_env(jni_env);
+    if (vm_env->IsVmShutdowning()) return;
+
+    jsize length = GetArrayLength(jni_env, array);
     jsize end = start + len;
     if(start < 0 || len < 0 || end > length) {
         char msg[30];
         sprintf(msg, "%d..%d", start, end);
-        ThrowNew_Quick(env, "java/lang/ArrayIndexOutOfBoundsException", msg);
+        ThrowNew_Quick(jni_env, "java/lang/ArrayIndexOutOfBoundsException", msg);
         return;
     }
 
@@ -1532,7 +1664,7 @@
 
 
 
-void JNICALL SetCharArrayRegion(JNIEnv *env,
+void JNICALL SetCharArrayRegion(JNIEnv * jni_env,
                                 jobjectArray array,
                                 jsize start,
                                 jsize len,
@@ -1540,12 +1672,16 @@
 {
     TRACE2("jni", "SetCharArrayRegion called");
     assert(hythread_is_suspend_enabled());
-    jsize length = GetArrayLength(env, array);
+
+    Global_Env * vm_env = jni_get_vm_env(jni_env);
+    if (vm_env->IsVmShutdowning()) return;
+
+    jsize length = GetArrayLength(jni_env, array);
     jsize end = start + len;
     if(start < 0 || len < 0 || end > length) {
         char msg[30];
         sprintf(msg, "%d..%d", start, end);
-        ThrowNew_Quick(env, "java/lang/ArrayIndexOutOfBoundsException", msg);
+        ThrowNew_Quick(jni_env, "java/lang/ArrayIndexOutOfBoundsException", msg);
         return;
     }
 
@@ -1563,7 +1699,7 @@
 
 
 
-void JNICALL SetShortArrayRegion(JNIEnv *env,
+void JNICALL SetShortArrayRegion(JNIEnv * jni_env,
                                  jobjectArray array,
                                  jsize start,
                                  jsize len,
@@ -1571,12 +1707,16 @@
 {
     TRACE2("jni", "SetShortArrayRegion called");
     assert(hythread_is_suspend_enabled());
-    jsize length = GetArrayLength(env, array);
+
+    Global_Env * vm_env = jni_get_vm_env(jni_env);
+    if (vm_env->IsVmShutdowning()) return;
+
+    jsize length = GetArrayLength(jni_env, array);
     jsize end = start + len;
     if(start < 0 || len < 0 || end > length) {
         char msg[30];
         sprintf(msg, "%d..%d", start, end);
-        ThrowNew_Quick(env, "java/lang/ArrayIndexOutOfBoundsException", msg);
+        ThrowNew_Quick(jni_env, "java/lang/ArrayIndexOutOfBoundsException", msg);
         return;
     }
 
@@ -1594,7 +1734,7 @@
 
 
 
-void JNICALL SetIntArrayRegion(JNIEnv *env,
+void JNICALL SetIntArrayRegion(JNIEnv * jni_env,
                                jobjectArray array,
                                jsize start,
                                jsize len,
@@ -1602,12 +1742,16 @@
 {
     TRACE2("jni", "SetIntArrayRegion called");
     assert(hythread_is_suspend_enabled());
-    jsize length = GetArrayLength(env, array);
+
+    Global_Env * vm_env = jni_get_vm_env(jni_env);
+    if (vm_env->IsVmShutdowning()) return;
+
+    jsize length = GetArrayLength(jni_env, array);
     jsize end = start + len;
     if(start < 0 || len < 0 || end > length) {
         char msg[30];
         sprintf(msg, "%d..%d", start, end);
-        ThrowNew_Quick(env, "java/lang/ArrayIndexOutOfBoundsException", msg);
+        ThrowNew_Quick(jni_env, "java/lang/ArrayIndexOutOfBoundsException", msg);
         return;
     }
 
@@ -1625,7 +1769,7 @@
 
 
 
-void JNICALL SetLongArrayRegion(JNIEnv *env,
+void JNICALL SetLongArrayRegion(JNIEnv * jni_env,
                                 jobjectArray array,
                                 jsize start,
                                 jsize len,
@@ -1633,12 +1777,16 @@
 {
     TRACE2("jni", "SetLongArrayRegion called");
     assert(hythread_is_suspend_enabled());
-    jsize length = GetArrayLength(env, array);
+
+    Global_Env * vm_env = jni_get_vm_env(jni_env);
+    if (vm_env->IsVmShutdowning()) return;
+
+    jsize length = GetArrayLength(jni_env, array);
     jsize end = start + len;
     if(start < 0 || len < 0 || end > length) {
         char msg[30];
         sprintf(msg, "%d..%d", start, end);
-        ThrowNew_Quick(env, "java/lang/ArrayIndexOutOfBoundsException", msg);
+        ThrowNew_Quick(jni_env, "java/lang/ArrayIndexOutOfBoundsException", msg);
         return;
     }
 
@@ -1656,7 +1804,7 @@
 
 
 
-void JNICALL SetFloatArrayRegion(JNIEnv *env,
+void JNICALL SetFloatArrayRegion(JNIEnv * jni_env,
                                  jobjectArray array,
                                  jsize start,
                                  jsize len,
@@ -1664,12 +1812,16 @@
 {
     TRACE2("jni", "SetFloatArrayRegion called");
     assert(hythread_is_suspend_enabled());
-    jsize length = GetArrayLength(env, array);
+
+    Global_Env * vm_env = jni_get_vm_env(jni_env);
+    if (vm_env->IsVmShutdowning()) return;
+
+    jsize length = GetArrayLength(jni_env, array);
     jsize end = start + len;
     if(start < 0 || len < 0 || end > length) {
         char msg[30];
         sprintf(msg, "%d..%d", start, end);
-        ThrowNew_Quick(env, "java/lang/ArrayIndexOutOfBoundsException", msg);
+        ThrowNew_Quick(jni_env, "java/lang/ArrayIndexOutOfBoundsException", msg);
         return;
     }
 
@@ -1687,7 +1839,7 @@
 
 
 
-void JNICALL SetDoubleArrayRegion(JNIEnv *env,
+void JNICALL SetDoubleArrayRegion(JNIEnv * jni_env,
                                   jobjectArray array,
                                   jsize start,
                                   jsize len,
@@ -1695,12 +1847,16 @@
 {
     TRACE2("jni", "SetDoubleArrayRegion called");
     assert(hythread_is_suspend_enabled());
-    jsize length = GetArrayLength(env, array);
+
+    Global_Env * vm_env = jni_get_vm_env(jni_env);
+    if (vm_env->IsVmShutdowning()) return;
+
+    jsize length = GetArrayLength(jni_env, array);
     jsize end = start + len;
     if(start < 0 || len < 0 || end > length) {
         char msg[30];
         sprintf(msg, "%d..%d", start, end);
-        ThrowNew_Quick(env, "java/lang/ArrayIndexOutOfBoundsException", msg);
+        ThrowNew_Quick(jni_env, "java/lang/ArrayIndexOutOfBoundsException", msg);
         return;
     }
 

Modified: harmony/enhanced/drlvm/trunk/vm/vmcore/src/jni/jni_field.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/vmcore/src/jni/jni_field.cpp?view=diff&rev=487483&r1=487482&r2=487483
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/vmcore/src/jni/jni_field.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/vmcore/src/jni/jni_field.cpp Fri Dec 15 00:33:21 2006
@@ -37,18 +37,22 @@
 #include "exceptions.h"
 
 
-jfieldID JNICALL GetFieldID(JNIEnv *env,
+jfieldID JNICALL GetFieldID(JNIEnv * jni_env,
                             jclass clazz,
                             const char *name,
                             const char *sig)
 {
     TRACE2("jni", "GetFieldID called");
     assert(hythread_is_suspend_enabled());
+
+    Global_Env * vm_env = jni_get_vm_env(jni_env);
+    if (vm_env->IsVmShutdowning()) return 0;
+
     Class* clss = jclass_to_struct_Class(clazz);
     Field *field = class_lookup_field_recursive(clss, name, sig);
     if (NULL == field || field->is_static())
     {
-        ThrowNew_Quick(env, "java/lang/NoSuchFieldError", name);
+        ThrowNew_Quick(jni_env, "java/lang/NoSuchFieldError", name);
         return 0;
     }
     TRACE2("jni", "GetFieldID " << clss->get_name()->bytes
@@ -61,12 +65,16 @@
 
 
 // non-standard
-jfieldID JNICALL GetFieldID_Quick(JNIEnv * UNREF env,
+jfieldID JNICALL GetFieldID_Quick(JNIEnv * jni_env,
                                   const char *class_name,
                                   const char *field_name,
                                   const char *sig)
 {
     assert(hythread_is_suspend_enabled());
+
+    Global_Env * vm_env = jni_get_vm_env(jni_env);
+    if (vm_env->IsVmShutdowning()) return 0;
+
     String *class_string = VM_Global_State::loader_env->string_pool.lookup(class_name);
     assert(hythread_is_suspend_enabled());
     Class *clss =
@@ -78,7 +86,7 @@
     return (jfieldID)field;
 } //GetFieldID_Quick
 
-jfieldID JNICALL GetStaticFieldID(JNIEnv *env,
+jfieldID JNICALL GetStaticFieldID(JNIEnv * jni_env,
                                   jclass clazz,
                                   const char *name,
                                   const char *sig)
@@ -86,11 +94,14 @@
     TRACE2("jni", "GetStaticFieldID called");
     assert(hythread_is_suspend_enabled());
 
+    Global_Env * vm_env = jni_get_vm_env(jni_env);
+    if (vm_env->IsVmShutdowning()) return 0;
+
     Class* clss = jclass_to_struct_Class(clazz);
     Field *field = class_lookup_field_recursive(clss, name, sig);
     if(NULL == field || !field->is_static())
     {
-        ThrowNew_Quick(env, "java/lang/NoSuchFieldError", name);
+        ThrowNew_Quick(jni_env, "java/lang/NoSuchFieldError", name);
         return 0;
     }
     TRACE2("jni", "GetStaticFieldID " << clss->get_name()->bytes
@@ -104,11 +115,14 @@
 // begin Get<Type>Field functions
 
 
-jobject JNICALL GetObjectFieldOffset(JNIEnv* UNREF env, jobject obj, jint offset)
+jobject JNICALL GetObjectFieldOffset(JNIEnv* UNREF jni_env, jobject obj, jint offset)
 {
     assert(hythread_is_suspend_enabled());
     ObjectHandle h = (ObjectHandle)obj;
 
+    Global_Env * vm_env = jni_get_vm_env(jni_env);
+    if (vm_env->IsVmShutdowning()) return NULL;
+
     tmn_suspend_disable();       //---------------------------------v
 
     Byte *java_ref = (Byte *)h->object;
@@ -125,27 +139,31 @@
     return (jobject)new_handle;
 }
 
-jobject JNICALL GetObjectField(JNIEnv *env,
+jobject JNICALL GetObjectField(JNIEnv * jni_env,
                                jobject obj,
                                jfieldID fieldID)
 {
     TRACE2("jni", "GetObjectField called, id = " << fieldID);
     assert(hythread_is_suspend_enabled());
+
     Field *f = (Field *)fieldID;
     assert(f);
-    assert(IsInstanceOf(env, obj, struct_Class_to_jclass(f->get_class())));
+    assert(IsInstanceOf(jni_env, obj, struct_Class_to_jclass(f->get_class())));
 
-    if (!ensure_initialised(env, f->get_class())) return 0;
+    if (!ensure_initialised(jni_env, f->get_class())) return NULL;
     assert(!f->is_static());
-    return GetObjectFieldOffset(env, obj, f->get_offset());
+    return GetObjectFieldOffset(jni_env, obj, f->get_offset());
 } //GetObjectField
 
 
-jboolean JNICALL GetBooleanFieldOffset(JNIEnv * UNREF env, jobject obj, jint offset)
+jboolean JNICALL GetBooleanFieldOffset(JNIEnv * UNREF jni_env, jobject obj, jint offset)
 {
     assert(hythread_is_suspend_enabled());
     ObjectHandle h = (ObjectHandle)obj;
 
+    Global_Env * vm_env = jni_get_vm_env(jni_env);
+    if (vm_env->IsVmShutdowning()) return 0;
+
     tmn_suspend_disable();       //---------------------------------v
 
     Byte *java_ref = (Byte *)h->object;
@@ -156,25 +174,29 @@
     return val;
 }
 
-jboolean JNICALL GetBooleanField(JNIEnv *env,
+jboolean JNICALL GetBooleanField(JNIEnv *jni_env,
                                  jobject obj,
                                  jfieldID fieldID)
 {
     TRACE2("jni", "GetBooleanField called, id = " << fieldID);
     assert(hythread_is_suspend_enabled());
+
     Field *f = (Field *)fieldID;
     assert(f);
-    if (!ensure_initialised(env, f->get_class())) return 0;
+    if (!ensure_initialised(jni_env, f->get_class())) return 0;
     assert(!f->is_static());
-    return GetBooleanFieldOffset(env, obj, f->get_offset());
+    return GetBooleanFieldOffset(jni_env, obj, f->get_offset());
 } //GetBooleanField
 
 
-jbyte JNICALL GetByteFieldOffset(JNIEnv * UNREF env, jobject obj, jint offset)
+jbyte JNICALL GetByteFieldOffset(JNIEnv * UNREF jni_env, jobject obj, jint offset)
 {
     assert(hythread_is_suspend_enabled());
     ObjectHandle h = (ObjectHandle)obj;
 
+    Global_Env * vm_env = jni_get_vm_env(jni_env);
+    if (vm_env->IsVmShutdowning()) return 0;
+
     tmn_suspend_disable();       //---------------------------------v
 
     Byte *java_ref = (Byte *)h->object;
@@ -185,27 +207,31 @@
     return val;
 }
 
-jbyte JNICALL GetByteField(JNIEnv *env,
+jbyte JNICALL GetByteField(JNIEnv * jni_env,
                            jobject obj,
                            jfieldID fieldID)
 {
     TRACE2("jni", "GetByteField called, id = " << fieldID);
     assert(hythread_is_suspend_enabled());
+    
     Field *f = (Field *)fieldID;
     assert(f);
-    assert(IsInstanceOf(env, obj, struct_Class_to_jclass(f->get_class())));
+    assert(IsInstanceOf(jni_env, obj, struct_Class_to_jclass(f->get_class())));
 
-    if (!ensure_initialised(env, f->get_class())) return 0;
+    if (!ensure_initialised(jni_env, f->get_class())) return 0;
     assert(!f->is_static());
-    return GetByteFieldOffset(env, obj, f->get_offset());
+    return GetByteFieldOffset(jni_env, obj, f->get_offset());
 } //GetByteField
 
 
-jchar JNICALL GetCharFieldOffset(JNIEnv * UNREF env, jobject obj, jint offset)
+jchar JNICALL GetCharFieldOffset(JNIEnv * UNREF jni_env, jobject obj, jint offset)
 {
     assert(hythread_is_suspend_enabled());
     ObjectHandle h = (ObjectHandle)obj;
 
+    Global_Env * vm_env = jni_get_vm_env(jni_env);
+    if (vm_env->IsVmShutdowning()) return 0;
+
     tmn_suspend_disable();     //---------------------------------v
 
     Byte *java_ref = (Byte *)h->object;
@@ -216,27 +242,31 @@
     return val;
 }
 
-jchar JNICALL GetCharField(JNIEnv *env,
+jchar JNICALL GetCharField(JNIEnv * jni_env,
                            jobject obj,
                            jfieldID fieldID)
 {
     TRACE2("jni", "GetCharField called, id = " << fieldID);
     assert(hythread_is_suspend_enabled());
+
     Field *f = (Field *)fieldID;
     assert(f);
-    assert(IsInstanceOf(env, obj, struct_Class_to_jclass(f->get_class())));
+    assert(IsInstanceOf(jni_env, obj, struct_Class_to_jclass(f->get_class())));
 
-    if (!ensure_initialised(env, f->get_class())) return 0;
+    if (!ensure_initialised(jni_env, f->get_class())) return 0;
     assert(!f->is_static());
-    return GetCharFieldOffset(env, obj, f->get_offset());
+    return GetCharFieldOffset(jni_env, obj, f->get_offset());
 } //GetCharField
 
 
-jshort JNICALL GetShortFieldOffset(JNIEnv * UNREF env, jobject obj, jint offset)
+jshort JNICALL GetShortFieldOffset(JNIEnv * UNREF jni_env, jobject obj, jint offset)
 {
     assert(hythread_is_suspend_enabled());
     ObjectHandle h = (ObjectHandle)obj;
 
+    Global_Env * vm_env = jni_get_vm_env(jni_env);
+    if (vm_env->IsVmShutdowning()) return 0;
+
     tmn_suspend_disable();       //---------------------------------v
 
     Byte *java_ref = (Byte *)h->object;
@@ -247,27 +277,31 @@
     return val;
 }
 
-jshort JNICALL GetShortField(JNIEnv *env,
+jshort JNICALL GetShortField(JNIEnv * jni_env,
                              jobject obj,
                              jfieldID fieldID)
 {
     TRACE2("jni", "GetShortField called, id = " << fieldID);
     assert(hythread_is_suspend_enabled());
+
     Field *f = (Field *)fieldID;
     assert(f);
-    assert(IsInstanceOf(env, obj, struct_Class_to_jclass(f->get_class())));
+    assert(IsInstanceOf(jni_env, obj, struct_Class_to_jclass(f->get_class())));
 
-    if (!ensure_initialised(env, f->get_class())) return 0;
+    if (!ensure_initialised(jni_env, f->get_class())) return 0;
     assert(!f->is_static());
-    return GetShortFieldOffset(env, obj, f->get_offset());
+    return GetShortFieldOffset(jni_env, obj, f->get_offset());
 } //GetShortField
 
 
-jint JNICALL GetIntFieldOffset(JNIEnv * UNREF env, jobject obj, jint offset)
+jint JNICALL GetIntFieldOffset(JNIEnv * UNREF jni_env, jobject obj, jint offset)
 {
     assert(hythread_is_suspend_enabled());
     ObjectHandle h = (ObjectHandle)obj;
 
+    Global_Env * vm_env = jni_get_vm_env(jni_env);
+    if (vm_env->IsVmShutdowning()) return 0;
+
     tmn_suspend_disable();       //---------------------------------v
 
     Byte *java_ref = (Byte *)h->object;
@@ -278,27 +312,31 @@
     return val;
 }
 
-jint JNICALL GetIntField(JNIEnv *env,
+jint JNICALL GetIntField(JNIEnv * jni_env,
                          jobject obj,
                          jfieldID fieldID)
 {
     TRACE2("jni", "GetIntField called, id = " << fieldID);
     assert(hythread_is_suspend_enabled());
+
     Field *f = (Field *)fieldID;
     assert(f);
-    assert(IsInstanceOf(env, obj, struct_Class_to_jclass(f->get_class())));
+    assert(IsInstanceOf(jni_env, obj, struct_Class_to_jclass(f->get_class())));
 
-    if (!ensure_initialised(env, f->get_class())) return 0;
+    if (!ensure_initialised(jni_env, f->get_class())) return 0;
     assert(!f->is_static());
-    return GetIntFieldOffset(env, obj, f->get_offset());
+    return GetIntFieldOffset(jni_env, obj, f->get_offset());
 } //GetIntField
 
 
-jlong JNICALL GetLongFieldOffset(JNIEnv * UNREF env, jobject obj, jint offset)
+jlong JNICALL GetLongFieldOffset(JNIEnv * UNREF jni_env, jobject obj, jint offset)
 {
     assert(hythread_is_suspend_enabled());
     ObjectHandle h = (ObjectHandle)obj;
 
+    Global_Env * vm_env = jni_get_vm_env(jni_env);
+    if (vm_env->IsVmShutdowning()) return 0;
+
     tmn_suspend_disable();       //---------------------------------v
 
     Byte *java_ref = (Byte *)h->object;
@@ -309,27 +347,31 @@
     return val;
 }
 
-jlong JNICALL GetLongField(JNIEnv *env,
+jlong JNICALL GetLongField(JNIEnv * jni_env,
                            jobject obj,
                            jfieldID fieldID)
 {
     TRACE2("jni", "GetLongField called, id = " << fieldID);
     assert(hythread_is_suspend_enabled());
+
     Field *f = (Field *)fieldID;
     assert(f);
-    assert(IsInstanceOf(env, obj, struct_Class_to_jclass(f->get_class())));
+    assert(IsInstanceOf(jni_env, obj, struct_Class_to_jclass(f->get_class())));
 
-    if (!ensure_initialised(env, f->get_class())) return 0;
+    if (!ensure_initialised(jni_env, f->get_class())) return 0;
     assert(!f->is_static());
-    return GetLongFieldOffset(env, obj, f->get_offset());
+    return GetLongFieldOffset(jni_env, obj, f->get_offset());
 } //GetLongField
 
 
-jfloat JNICALL GetFloatFieldOffset(JNIEnv * UNREF env, jobject obj, jint offset)
+jfloat JNICALL GetFloatFieldOffset(JNIEnv * UNREF jni_env, jobject obj, jint offset)
 {
     assert(hythread_is_suspend_enabled());
     ObjectHandle h = (ObjectHandle)obj;
 
+    Global_Env * vm_env = jni_get_vm_env(jni_env);
+    if (vm_env->IsVmShutdowning()) return 0;
+
     tmn_suspend_disable();       //---------------------------------v
 
     Byte *java_ref = (Byte *)h->object;
@@ -340,27 +382,31 @@
     return val;
 }
 
-jfloat JNICALL GetFloatField(JNIEnv *env,
+jfloat JNICALL GetFloatField(JNIEnv * jni_env,
                              jobject obj,
                              jfieldID fieldID)
 {
     TRACE2("jni", "GetFloatField called, id = " << fieldID);
     assert(hythread_is_suspend_enabled());
+
     Field *f = (Field *)fieldID;
     assert(f);
-    assert(IsInstanceOf(env, obj, struct_Class_to_jclass(f->get_class())));
+    assert(IsInstanceOf(jni_env, obj, struct_Class_to_jclass(f->get_class())));
 
-    if (!ensure_initialised(env, f->get_class())) return 0;
+    if (!ensure_initialised(jni_env, f->get_class())) return 0;
     assert(!f->is_static());
-    return GetFloatFieldOffset(env, obj, f->get_offset());
+    return GetFloatFieldOffset(jni_env, obj, f->get_offset());
 } //GetFloatField
 
 
-jdouble JNICALL GetDoubleFieldOffset(JNIEnv * UNREF env, jobject obj, jint offset)
+jdouble JNICALL GetDoubleFieldOffset(JNIEnv * UNREF jni_env, jobject obj, jint offset)
 {
     assert(hythread_is_suspend_enabled());
     ObjectHandle h = (ObjectHandle)obj;
 
+    Global_Env * vm_env = jni_get_vm_env(jni_env);
+    if (vm_env->IsVmShutdowning()) return 0;
+    
     tmn_suspend_disable();       //---------------------------------v
 
     Byte *java_ref = (Byte *)h->object;
@@ -371,19 +417,20 @@
     return val;
 }
 
-jdouble JNICALL GetDoubleField(JNIEnv *env,
+jdouble JNICALL GetDoubleField(JNIEnv * jni_env,
                                jobject obj,
                                jfieldID fieldID)
 {
     TRACE2("jni", "GetDoubleField called, id = " << fieldID);
     assert(hythread_is_suspend_enabled());
+
     Field *f = (Field *)fieldID;
     assert(f);
-    assert(IsInstanceOf(env, obj, struct_Class_to_jclass(f->get_class())));
+    assert(IsInstanceOf(jni_env, obj, struct_Class_to_jclass(f->get_class())));
 
-    if (!ensure_initialised(env, f->get_class())) return 0;
+    if (!ensure_initialised(jni_env, f->get_class())) return 0;
     assert(!f->is_static());
-    return GetDoubleFieldOffset(env, obj, f->get_offset());
+    return GetDoubleFieldOffset(jni_env, obj, f->get_offset());
 } //GetDoubleField
 
 
@@ -397,12 +444,15 @@
 // begin Set<Type>Field functions
 
 
-void JNICALL SetObjectFieldOffset(JNIEnv * UNREF env, jobject obj, jint offset, jobject value)
+void JNICALL SetObjectFieldOffset(JNIEnv * UNREF jni_env, jobject obj, jint offset, jobject value)
 {
     assert(hythread_is_suspend_enabled());
     ObjectHandle h = (ObjectHandle)obj;
     ObjectHandle v = (ObjectHandle)value;
 
+    Global_Env * vm_env = jni_get_vm_env(jni_env);
+    if (vm_env->IsVmShutdowning()) return;
+
     tmn_suspend_disable();       //---------------------------------v
 
     Byte *java_ref = (Byte *)h->object;
@@ -420,28 +470,32 @@
     tmn_suspend_enable();        //---------------------------------^
 }
 
-void JNICALL SetObjectField(JNIEnv *env,
+void JNICALL SetObjectField(JNIEnv * jni_env,
                             jobject obj,
                             jfieldID fieldID,
                             jobject value)
 {
     TRACE2("jni", "SetObjectField called, id = " << fieldID);
     assert(hythread_is_suspend_enabled());
+
     Field *f = (Field *)fieldID;
     assert(f);
-    assert(IsInstanceOf(env, obj, struct_Class_to_jclass(f->get_class())));
+    assert(IsInstanceOf(jni_env, obj, struct_Class_to_jclass(f->get_class())));
 
-    if (!ensure_initialised(env, f->get_class())) return;
+    if (!ensure_initialised(jni_env, f->get_class())) return;
     assert(!f->is_static());
-    SetObjectFieldOffset(env, obj, f->get_offset(), value);
+    SetObjectFieldOffset(jni_env, obj, f->get_offset(), value);
 } //SetObjectField
 
 
-void JNICALL SetBooleanFieldOffset(JNIEnv * UNREF env, jobject obj, jint offset, jboolean value)
+void JNICALL SetBooleanFieldOffset(JNIEnv * UNREF jni_env, jobject obj, jint offset, jboolean value)
 {
     assert(hythread_is_suspend_enabled());
     ObjectHandle h = (ObjectHandle)obj;
 
+    Global_Env * vm_env = jni_get_vm_env(jni_env);
+    if (vm_env->IsVmShutdowning()) return;
+
     tmn_suspend_disable();       //---------------------------------v
 
     Byte *java_ref = (Byte *)h->object;
@@ -450,30 +504,34 @@
     tmn_suspend_enable();        //---------------------------------^
 }
 
-void JNICALL SetBooleanField(JNIEnv *env,
+void JNICALL SetBooleanField(JNIEnv * jni_env,
                              jobject obj,
                              jfieldID fieldID,
                              jboolean value)
 {
     TRACE2("jni", "SetBooleanField called, id = " << fieldID << " value = " << value);
     assert(hythread_is_suspend_enabled());
+
     Field *f = (Field *)fieldID;
     assert(f);
-    if (!ensure_initialised(env, f->get_class())) return;
+    if (!ensure_initialised(jni_env, f->get_class())) return;
     assert(!f->is_static());
-    SetBooleanFieldOffset(env, obj, f->get_offset(), value);
+    SetBooleanFieldOffset(jni_env, obj, f->get_offset(), value);
 } //SetBooleanField
 
 
-void JNICALL SetByteFieldOffset(JNIEnv * UNREF env, jobject obj, jint offset, jbyte value)
+void JNICALL SetByteFieldOffset(JNIEnv * jni_env, jobject obj, jint offset, jbyte value)
 {
     assert(hythread_is_suspend_enabled());
     ObjectHandle h = (ObjectHandle)obj;
 
+    Global_Env * vm_env = jni_get_vm_env(jni_env);
+    if (vm_env->IsVmShutdowning()) return;
+
     tmn_suspend_disable();       //---------------------------------v
 
     Byte *java_ref = (Byte *)h->object;
-    if(VM_Global_State::loader_env->compact_fields)
+    if(vm_env->compact_fields)
         *(jbyte *)(java_ref + offset) = value;
     else
         *(jint *)(java_ref + offset) = value;
@@ -481,28 +539,32 @@
     tmn_suspend_enable();        //---------------------------------^
 }
 
-void JNICALL SetByteField(JNIEnv *env,
+void JNICALL SetByteField(JNIEnv * jni_env,
                           jobject obj,
                           jfieldID fieldID,
                           jbyte value)
 {
     TRACE2("jni", "SetByteField called, id = " << fieldID << " value = " << value);
     assert(hythread_is_suspend_enabled());
+
     Field *f = (Field *)fieldID;
     assert(f);
-    assert(IsInstanceOf(env, obj, struct_Class_to_jclass(f->get_class())));
+    assert(IsInstanceOf(jni_env, obj, struct_Class_to_jclass(f->get_class())));
 
-    if (!ensure_initialised(env, f->get_class())) return;
+    if (!ensure_initialised(jni_env, f->get_class())) return;
     assert(!f->is_static());
-    SetByteFieldOffset(env, obj, f->get_offset(), value);
+    SetByteFieldOffset(jni_env, obj, f->get_offset(), value);
 } //SetByteField
 
 
-void JNICALL SetCharFieldOffset(JNIEnv * UNREF env, jobject obj, jint offset, jchar value)
+void JNICALL SetCharFieldOffset(JNIEnv * UNREF jni_env, jobject obj, jint offset, jchar value)
 {
     assert(hythread_is_suspend_enabled());
     ObjectHandle h = (ObjectHandle)obj;
 
+    Global_Env * vm_env = jni_get_vm_env(jni_env);
+    if (vm_env->IsVmShutdowning()) return;
+
     tmn_suspend_disable();       //---------------------------------v
 
     Byte *java_ref = (Byte *)h->object;
@@ -511,32 +573,36 @@
     tmn_suspend_enable();        //---------------------------------^
 }
 
-void JNICALL SetCharField(JNIEnv *env,
+void JNICALL SetCharField(JNIEnv * jni_env,
                           jobject obj,
                           jfieldID fieldID,
                           jchar value)
 {
     TRACE2("jni", "SetCharField called, id = " << fieldID << " value = " << value);
     assert(hythread_is_suspend_enabled());
+
     Field *f = (Field *)fieldID;
     assert(f);
-    assert(IsInstanceOf(env, obj, struct_Class_to_jclass(f->get_class())));
+    assert(IsInstanceOf(jni_env, obj, struct_Class_to_jclass(f->get_class())));
 
-    if (!ensure_initialised(env, f->get_class())) return;
+    if (!ensure_initialised(jni_env, f->get_class())) return;
     assert(!f->is_static());
-    SetCharFieldOffset(env, obj, f->get_offset(), value);
+    SetCharFieldOffset(jni_env, obj, f->get_offset(), value);
 } //SetCharField
 
 
-void JNICALL SetShortFieldOffset(JNIEnv * UNREF env, jobject obj, jint offset, jshort value)
+void JNICALL SetShortFieldOffset(JNIEnv * UNREF jni_env, jobject obj, jint offset, jshort value)
 {
     assert(hythread_is_suspend_enabled());
     ObjectHandle h = (ObjectHandle)obj;
 
+    Global_Env * vm_env = jni_get_vm_env(jni_env);
+    if (vm_env->IsVmShutdowning()) return;
+
     tmn_suspend_disable();       //---------------------------------v
 
     Byte *java_ref = (Byte *)h->object;
-    if (VM_Global_State::loader_env->compact_fields)
+    if (vm_env->compact_fields)
         *(jshort *)(java_ref + offset) = value;
     else
         *(jint *)(java_ref + offset) = value;
@@ -544,28 +610,32 @@
     tmn_suspend_enable();        //---------------------------------^
 }
 
-void JNICALL SetShortField(JNIEnv *env,
+void JNICALL SetShortField(JNIEnv * jni_env,
                            jobject obj,
                            jfieldID fieldID,
                            jshort value)
 {
     TRACE2("jni", "SetShortField called, id = " << fieldID << " value = " << value);
     assert(hythread_is_suspend_enabled());
+
     Field *f = (Field *)fieldID;
     assert(f);
-    assert(IsInstanceOf(env, obj, struct_Class_to_jclass(f->get_class())));
+    assert(IsInstanceOf(jni_env, obj, struct_Class_to_jclass(f->get_class())));
 
-    if (!ensure_initialised(env, f->get_class())) return;
+    if (!ensure_initialised(jni_env, f->get_class())) return;
     assert(!f->is_static());
-    SetShortFieldOffset(env, obj, f->get_offset(), value);
+    SetShortFieldOffset(jni_env, obj, f->get_offset(), value);
 } //SetShortField
 
 
-void JNICALL SetIntFieldOffset(JNIEnv * UNREF env, jobject obj, jint offset, jint value)
+void JNICALL SetIntFieldOffset(JNIEnv * UNREF jni_env, jobject obj, jint offset, jint value)
 {
     assert(hythread_is_suspend_enabled());
     ObjectHandle h = (ObjectHandle)obj;
 
+    Global_Env * vm_env = jni_get_vm_env(jni_env);
+    if (vm_env->IsVmShutdowning()) return;
+
     tmn_suspend_disable();       //---------------------------------v
 
     Byte *java_ref = (Byte *)h->object;
@@ -574,28 +644,32 @@
     tmn_suspend_enable();        //---------------------------------^
 }
 
-void JNICALL SetIntField(JNIEnv *env,
+void JNICALL SetIntField(JNIEnv * jni_env,
                          jobject obj,
                          jfieldID fieldID,
                          jint value)
 {
     TRACE2("jni", "SetIntField called, id = " << fieldID << " value = " << value);
     assert(hythread_is_suspend_enabled());
+
     Field *f = (Field *)fieldID;
     assert(f);
-    assert(IsInstanceOf(env, obj, struct_Class_to_jclass(f->get_class())));
+    assert(IsInstanceOf(jni_env, obj, struct_Class_to_jclass(f->get_class())));
 
-    if (!ensure_initialised(env, f->get_class())) return;
+    if (!ensure_initialised(jni_env, f->get_class())) return;
     assert(!f->is_static());
-    SetIntFieldOffset(env, obj, f->get_offset(), value);
+    SetIntFieldOffset(jni_env, obj, f->get_offset(), value);
 } //SetIntField
 
 
-void JNICALL SetLongFieldOffset(JNIEnv * UNREF env, jobject obj, jint offset, jlong value)
+void JNICALL SetLongFieldOffset(JNIEnv * UNREF jni_env, jobject obj, jint offset, jlong value)
 {
     assert(hythread_is_suspend_enabled());
     ObjectHandle h = (ObjectHandle)obj;
 
+    Global_Env * vm_env = jni_get_vm_env(jni_env);
+    if (vm_env->IsVmShutdowning()) return;
+
     tmn_suspend_disable();       //---------------------------------v
 
     Byte *java_ref = (Byte *)h->object;
@@ -604,27 +678,31 @@
     tmn_suspend_enable();        //---------------------------------^
 }
 
-void JNICALL SetLongField(JNIEnv *env,
+void JNICALL SetLongField(JNIEnv * jni_env,
                           jobject obj,
                           jfieldID fieldID,
                           jlong value)
 {
     TRACE2("jni", "SetLongField called, id = " << fieldID << " value = " << value);
     assert(hythread_is_suspend_enabled());
+
     Field *f = (Field *)fieldID;
     assert(f);
-    assert(IsInstanceOf(env, obj, struct_Class_to_jclass(f->get_class())));
-    if (!ensure_initialised(env, f->get_class())) return;
+    assert(IsInstanceOf(jni_env, obj, struct_Class_to_jclass(f->get_class())));
+    if (!ensure_initialised(jni_env, f->get_class())) return;
     assert(!f->is_static());
-    SetLongFieldOffset(env, obj, f->get_offset(), value);
+    SetLongFieldOffset(jni_env, obj, f->get_offset(), value);
 } //SetLongField
 
 
-void JNICALL SetFloatFieldOffset(JNIEnv * UNREF env, jobject obj, jint offset, jfloat value)
+void JNICALL SetFloatFieldOffset(JNIEnv * UNREF jni_env, jobject obj, jint offset, jfloat value)
 {
     assert(hythread_is_suspend_enabled());
     ObjectHandle h = (ObjectHandle)obj;
 
+    Global_Env * vm_env = jni_get_vm_env(jni_env);
+    if (vm_env->IsVmShutdowning()) return;
+
     tmn_suspend_disable();       //---------------------------------v
 
     Byte *java_ref = (Byte *)h->object;
@@ -633,28 +711,32 @@
     tmn_suspend_enable();        //---------------------------------^
 }
 
-void JNICALL SetFloatField(JNIEnv *env,
+void JNICALL SetFloatField(JNIEnv * jni_env,
                            jobject obj,
                            jfieldID fieldID,
                            jfloat value)
 {
     TRACE2("jni", "SetFloatField called, id = " << fieldID << " value = " << value);
     assert(hythread_is_suspend_enabled());
+
     Field *f = (Field *)fieldID;
     assert(f);
-    assert(IsInstanceOf(env, obj, struct_Class_to_jclass(f->get_class())));
+    assert(IsInstanceOf(jni_env, obj, struct_Class_to_jclass(f->get_class())));
 
-    if (!ensure_initialised(env, f->get_class())) return;
+    if (!ensure_initialised(jni_env, f->get_class())) return;
     assert(!f->is_static());
-    SetFloatFieldOffset(env, obj, f->get_offset(), value);
+    SetFloatFieldOffset(jni_env, obj, f->get_offset(), value);
 } //SetFloatField
 
 
-void JNICALL SetDoubleFieldOffset(JNIEnv * UNREF env, jobject obj, jint offset, jdouble value)
+void JNICALL SetDoubleFieldOffset(JNIEnv * UNREF jni_env, jobject obj, jint offset, jdouble value)
 {
     assert(hythread_is_suspend_enabled());
     ObjectHandle h = (ObjectHandle)obj;
 
+    Global_Env * vm_env = jni_get_vm_env(jni_env);
+    if (vm_env->IsVmShutdowning()) return;
+
     tmn_suspend_disable();       //---------------------------------v
 
     Byte *java_ref = (Byte *)h->object;
@@ -663,20 +745,21 @@
     tmn_suspend_enable();        //---------------------------------^
 }
 
-void JNICALL SetDoubleField(JNIEnv *env,
+void JNICALL SetDoubleField(JNIEnv * jni_env,
                             jobject obj,
                             jfieldID fieldID,
                             jdouble value)
 {
     TRACE2("jni", "SetDoubleField called, id = " << fieldID << " value = " << value);
     assert(hythread_is_suspend_enabled());
+
     Field *f = (Field *)fieldID;
     assert(f);
-    assert(IsInstanceOf(env, obj, struct_Class_to_jclass(f->get_class())));
+    assert(IsInstanceOf(jni_env, obj, struct_Class_to_jclass(f->get_class())));
 
-    if (!ensure_initialised(env, f->get_class())) return;
+    if (!ensure_initialised(jni_env, f->get_class())) return;
     assert(!f->is_static());
-    SetDoubleFieldOffset(env, obj, f->get_offset(), value);
+    SetDoubleFieldOffset(jni_env, obj, f->get_offset(), value);
 } //SetDoubleField
 
 
@@ -693,15 +776,19 @@
 #include "jit_runtime_support_common.h"
 #endif
 
-jobject JNICALL GetStaticObjectField(JNIEnv *env,
+jobject JNICALL GetStaticObjectField(JNIEnv * jni_env,
                                      jclass UNREF clazz,
                                      jfieldID fieldID)
 {
     TRACE2("jni", "GetStaticObjectField called, id = " << fieldID);
     assert(hythread_is_suspend_enabled());
+
+    Global_Env * vm_env = jni_get_vm_env(jni_env);
+    if (vm_env->IsVmShutdowning()) return NULL;
+
     Field *f = (Field *)fieldID;
     assert(f);
-    if (!ensure_initialised(env, f->get_class())) return 0;
+    if (!ensure_initialised(jni_env, f->get_class())) return NULL;
     assert(f->is_static());
     tmn_suspend_disable();       //---------------------------------v
     ManagedObject **field_addr = (ManagedObject **)f->get_address();
@@ -721,113 +808,145 @@
     return (jobject)new_handle;
 } //GetStaticObjectField
 
-jboolean JNICALL GetStaticBooleanField(JNIEnv *env,
+jboolean JNICALL GetStaticBooleanField(JNIEnv * jni_env,
                                        jclass UNREF clazz,
                                        jfieldID fieldID)
 {
     TRACE2("jni", "GetStaticBooleanField called, id = " << fieldID);
     assert(hythread_is_suspend_enabled());
+
+    Global_Env * vm_env = jni_get_vm_env(jni_env);
+    if (vm_env->IsVmShutdowning()) return 0;
+
     Field *f = (Field *)fieldID;
     assert(f);
-    if (!ensure_initialised(env, f->get_class())) return 0;
+    if (!ensure_initialised(jni_env, f->get_class())) return 0;
     assert(f->is_static());
     jboolean *field_addr = (jboolean *)f->get_address();
     return *field_addr;
 } //GetStaticBooleanField
 
-jbyte JNICALL GetStaticByteField(JNIEnv *env,
+jbyte JNICALL GetStaticByteField(JNIEnv * jni_env,
                                  jclass UNREF clazz,
                                  jfieldID fieldID)
 {
     TRACE2("jni", "GetStaticByteField called, id = " << fieldID);
     assert(hythread_is_suspend_enabled());
+
+    Global_Env * vm_env = jni_get_vm_env(jni_env);
+    if (vm_env->IsVmShutdowning()) return 0;
+
     Field *f = (Field *)fieldID;
     assert(f);
-    if (!ensure_initialised(env, f->get_class())) return 0;
+    if (!ensure_initialised(jni_env, f->get_class())) return 0;
     assert(f->is_static());
     jbyte *field_addr = (jbyte *)f->get_address();
     return *field_addr;
 } //GetStaticByteField
 
-jchar JNICALL GetStaticCharField(JNIEnv *env,
+jchar JNICALL GetStaticCharField(JNIEnv * jni_env,
                                  jclass UNREF clazz,
                                  jfieldID fieldID)
 {
     TRACE2("jni", "GetStaticCharField called, id = " << fieldID);
     assert(hythread_is_suspend_enabled());
+
+    Global_Env * vm_env = jni_get_vm_env(jni_env);
+    if (vm_env->IsVmShutdowning()) return 0;
+
     Field *f = (Field *)fieldID;
     assert(f);
-    if (!ensure_initialised(env, f->get_class())) return 0;
+    if (!ensure_initialised(jni_env, f->get_class())) return 0;
     assert(f->is_static());
     jchar *field_addr = (jchar *)f->get_address();
     return *field_addr;
 } //GetStaticCharField
 
-jshort JNICALL GetStaticShortField(JNIEnv *env,
+jshort JNICALL GetStaticShortField(JNIEnv * jni_env,
                                    jclass UNREF clazz,
                                    jfieldID fieldID)
 {
     TRACE2("jni", "GetStaticShortField called, id = " << fieldID);
     assert(hythread_is_suspend_enabled());
+
+    Global_Env * vm_env = jni_get_vm_env(jni_env);
+    if (vm_env->IsVmShutdowning()) return 0;
+
     Field *f = (Field *)fieldID;
     assert(f);
-    if (!ensure_initialised(env, f->get_class())) return 0;
+    if (!ensure_initialised(jni_env, f->get_class())) return 0;
     assert(f->is_static());
     jshort *field_addr = (jshort *)f->get_address();
     return *field_addr;
 } //GetStaticShortField
 
-jint JNICALL GetStaticIntField(JNIEnv *env,
+jint JNICALL GetStaticIntField(JNIEnv * jni_env,
                                jclass UNREF clazz,
                                jfieldID fieldID)
 {
     TRACE2("jni", "GetStaticIntField called, id = " << fieldID);
     assert(hythread_is_suspend_enabled());
+
+    Global_Env * vm_env = jni_get_vm_env(jni_env);
+    if (vm_env->IsVmShutdowning()) return 0;
+
     Field *f = (Field *)fieldID;
     assert(f);
-    if (!ensure_initialised(env, f->get_class())) return 0;
+    if (!ensure_initialised(jni_env, f->get_class())) return 0;
     assert(f->is_static());
     jint *field_addr = (jint *)f->get_address();
     return *field_addr;
 } //GetStaticIntField
 
-jlong JNICALL GetStaticLongField(JNIEnv *env,
+jlong JNICALL GetStaticLongField(JNIEnv * jni_env,
                                  jclass UNREF clazz,
                                  jfieldID fieldID)
 {
     TRACE2("jni", "GetStaticLongField called, id = " << fieldID);
     assert(hythread_is_suspend_enabled());
+
+    Global_Env * vm_env = jni_get_vm_env(jni_env);
+    if (vm_env->IsVmShutdowning()) return 0;
+
     Field *f = (Field *)fieldID;
     assert(f);
-    if (!ensure_initialised(env, f->get_class())) return 0;
+    if (!ensure_initialised(jni_env, f->get_class())) return 0;
     assert(f->is_static());
     jlong *field_addr = (jlong *)f->get_address();
     return *field_addr;
 } //GetStaticLongField
 
-jfloat JNICALL GetStaticFloatField(JNIEnv *env,
+jfloat JNICALL GetStaticFloatField(JNIEnv * jni_env,
                                   jclass UNREF clazz,
                                   jfieldID fieldID)
 {
     TRACE2("jni", "GetStaticFloatField called, id = " << fieldID);
     assert(hythread_is_suspend_enabled());
+
+    Global_Env * vm_env = jni_get_vm_env(jni_env);
+    if (vm_env->IsVmShutdowning()) return 0;
+
     Field *f = (Field *)fieldID;
     assert(f);
-    if (!ensure_initialised(env, f->get_class())) return 0;
+    if (!ensure_initialised(jni_env, f->get_class())) return 0;
     assert(f->is_static());
     jfloat *field_addr = (jfloat *)f->get_address();
     return *field_addr;
 } //GetStaticFloatField
 
-jdouble JNICALL GetStaticDoubleField(JNIEnv *env,
+jdouble JNICALL GetStaticDoubleField(JNIEnv * jni_env,
                                      jclass UNREF clazz,
                                      jfieldID fieldID)
 {
     TRACE2("jni", "GetStaticDoubleField called, id = " << fieldID);
     assert(hythread_is_suspend_enabled());
+
+    Global_Env * vm_env = jni_get_vm_env(jni_env);
+    if (vm_env->IsVmShutdowning()) return 0;
+
     Field *f = (Field *)fieldID;
     assert(f);
-    if (!ensure_initialised(env, f->get_class())) return 0;
+    if (!ensure_initialised(jni_env, f->get_class())) return 0;
     assert(f->is_static());
     jdouble *field_addr = (jdouble *)f->get_address();
     return *field_addr;
@@ -845,16 +964,20 @@
 // begin SetStatic<Type>Field functions
 
 
-void JNICALL SetStaticObjectField(JNIEnv *env,
+void JNICALL SetStaticObjectField(JNIEnv * jni_env,
                                   jclass UNREF clazz,
                                   jfieldID fieldID,
                                   jobject value)
 {
     TRACE2("jni", "SetStaticObjectField called, id = " << fieldID);
     assert(hythread_is_suspend_enabled());
+
+    Global_Env * vm_env = jni_get_vm_env(jni_env);
+    if (vm_env->IsVmShutdowning()) return;
+
     Field *f = (Field *)fieldID;
     assert(f);
-    if (!ensure_initialised(env, f->get_class())) return;
+    if (!ensure_initialised(jni_env, f->get_class())) return;
     assert(f->is_static());
     tmn_suspend_disable();       //---------------------------------v
     ManagedObject **field_addr = (ManagedObject **)f->get_address();
@@ -871,88 +994,108 @@
 } //SetStaticObjectField
 
 
-void JNICALL SetStaticBooleanField(JNIEnv *env,
+void JNICALL SetStaticBooleanField(JNIEnv * jni_env,
                                    jclass UNREF clazz,
                                    jfieldID fieldID,
                                    jboolean value)
 {
     TRACE2("jni", "SetStaticBooleanField called, id = " << fieldID << " value = " << value);
     assert(hythread_is_suspend_enabled());
+
+    Global_Env * vm_env = jni_get_vm_env(jni_env);
+    if (vm_env->IsVmShutdowning()) return;
+
     Field *f = (Field *)fieldID;
     assert(f);
-    if (!ensure_initialised(env, f->get_class())) return;
+    if (!ensure_initialised(jni_env, f->get_class())) return;
     assert(f->is_static());
     jboolean *field_addr = (jboolean *)f->get_address();
     *field_addr = value;
 } //SetStaticBooleanField
 
 
-void JNICALL SetStaticByteField(JNIEnv *env,
+void JNICALL SetStaticByteField(JNIEnv * jni_env,
                                 jclass UNREF clazz,
                                 jfieldID fieldID,
                                 jbyte value)
 {
     TRACE2("jni", "SetStaticByteField called, id = " << fieldID << " value = " << value);
     assert(hythread_is_suspend_enabled());
+
+    Global_Env * vm_env = jni_get_vm_env(jni_env);
+    if (vm_env->IsVmShutdowning()) return;
+
     Field *f = (Field *)fieldID;
     assert(f);
-    if (!ensure_initialised(env, f->get_class())) return;
+    if (!ensure_initialised(jni_env, f->get_class())) return;
     assert(f->is_static());
     jbyte *field_addr = (jbyte *)f->get_address();
     jint *field_addr_int = (jint *)f->get_address();
-    if (VM_Global_State::loader_env->compact_fields)
+    if (vm_env->compact_fields)
         *field_addr = value;
     else
         *field_addr_int = value;
 } //SetStaticByteField
 
 
-void JNICALL SetStaticCharField(JNIEnv *env,
+void JNICALL SetStaticCharField(JNIEnv * jni_env,
                                 jclass UNREF clazz,
                                 jfieldID fieldID,
                                 jchar value)
 {
     TRACE2("jni", "SetStaticCharField called, id = " << fieldID << " value = " << value);
     assert(hythread_is_suspend_enabled());
+
+    Global_Env * vm_env = jni_get_vm_env(jni_env);
+    if (vm_env->IsVmShutdowning()) return;
+
     Field *f = (Field *)fieldID;
     assert(f);
-    if (!ensure_initialised(env, f->get_class())) return;
+    if (!ensure_initialised(jni_env, f->get_class())) return;
     assert(f->is_static());
     jchar *field_addr = (jchar *)f->get_address();
     *field_addr = value;
 } //SetStaticCharField
 
 
-void JNICALL SetStaticShortField(JNIEnv *env,
+void JNICALL SetStaticShortField(JNIEnv * jni_env,
                                  jclass UNREF clazz,
                                  jfieldID fieldID,
                                  jshort value)
 {
     TRACE2("jni", "SetStaticShortField called, id = " << fieldID << " value = " << value);
     assert(hythread_is_suspend_enabled());
+
+    Global_Env * vm_env = jni_get_vm_env(jni_env);
+    if (vm_env->IsVmShutdowning()) return;
+
     Field *f = (Field *)fieldID;
     assert(f);
-    if (!ensure_initialised(env, f->get_class())) return;
+    if (!ensure_initialised(jni_env, f->get_class())) return;
     assert(f->is_static());
     jshort *field_addr = (jshort *)f->get_address();
     jint *field_addr_int = (jint *)f->get_address();
-    if (VM_Global_State::loader_env->compact_fields)
+    if (vm_env->compact_fields)
         *field_addr = value;
     else
         *field_addr_int = value;
 } //SetStaticShortField
 
 
-void JNICALL SetStaticIntField(JNIEnv *env,
+void JNICALL SetStaticIntField(JNIEnv * jni_env,
                                jclass UNREF clazz,
                                jfieldID fieldID,
                                jint value)
 {
     TRACE2("jni", "SetStaticIntField called, id = " << fieldID << " value = " << value);
     assert(hythread_is_suspend_enabled());
+
+    Global_Env * vm_env = jni_get_vm_env(jni_env);
+    if (vm_env->IsVmShutdowning()) return;
+
     Field *f = (Field *)fieldID;
     assert(f);
-    if (!ensure_initialised(env, f->get_class())) return;
+    if (!ensure_initialised(jni_env, f->get_class())) return;
     assert(f->is_static());
     jint *field_addr = (jint *)f->get_address();
     *field_addr = value;
@@ -960,48 +1103,60 @@
 
 
 
-void JNICALL SetStaticLongField(JNIEnv *env,
+void JNICALL SetStaticLongField(JNIEnv * jni_env,
                                 jclass UNREF clazz,
                                 jfieldID fieldID,
                                 jlong value)
 {
     TRACE2("jni", "SetStaticLongField called, id = " << fieldID << " value = " << value);
     assert(hythread_is_suspend_enabled());
+
+    Global_Env * vm_env = jni_get_vm_env(jni_env);
+    if (vm_env->IsVmShutdowning()) return;
+
     Field *f = (Field *)fieldID;
     assert(f);
-    if (!ensure_initialised(env, f->get_class())) return;
+    if (!ensure_initialised(jni_env, f->get_class())) return;
     assert(f->is_static());
     jlong *field_addr = (jlong *)f->get_address();
     *field_addr = value;
 } //SetStaticLongField
 
 
-void JNICALL SetStaticFloatField(JNIEnv *env,
+void JNICALL SetStaticFloatField(JNIEnv * jni_env,
                                  jclass UNREF clazz,
                                  jfieldID fieldID,
                                  jfloat value)
 {
     TRACE2("jni", "SetStaticFloatField called, id = " << fieldID << " value = " << value);
     assert(hythread_is_suspend_enabled());
+
+    Global_Env * vm_env = jni_get_vm_env(jni_env);
+    if (vm_env->IsVmShutdowning()) return;
+
     Field *f = (Field *)fieldID;
     assert(f);
-    if (!ensure_initialised(env, f->get_class())) return;
+    if (!ensure_initialised(jni_env, f->get_class())) return;
     assert(f->is_static());
     jfloat *field_addr = (jfloat *)f->get_address();
     *field_addr = value;
 } //SetStaticFloatField
 
 
-void JNICALL SetStaticDoubleField(JNIEnv *env,
+void JNICALL SetStaticDoubleField(JNIEnv * jni_env,
                                   jclass UNREF clazz,
                                   jfieldID fieldID,
                                   jdouble value)
 {
     TRACE2("jni", "SetStaticDoubleField called, id = " << fieldID << " value = " << value);
     assert(hythread_is_suspend_enabled());
+
+    Global_Env * vm_env = jni_get_vm_env(jni_env);
+    if (vm_env->IsVmShutdowning()) return;
+
     Field *f = (Field *)fieldID;
     assert(f);
-    if (!ensure_initialised(env, f->get_class())) return;
+    if (!ensure_initialised(jni_env, f->get_class())) return;
     assert(f->is_static());
     jdouble *field_addr = (jdouble *)f->get_address();
     *field_addr = value;