src/share/native/com/sun/java/util/jar/pack/jni.cpp

Print this page




  65   if (uPtr == null) {
  66     if (noCreate)  return null;
  67     uPtr = new unpacker();
  68     if (uPtr == null) {
  69       THROW_IOE(ERROR_ENOMEM);
  70       return null;
  71     }
  72     //fprintf(stderr, "get_unpacker(%p) uPtr=%p initializing\n", pObj, uPtr);
  73     uPtr->init(read_input_via_jni);
  74     uPtr->jniobj = (void*) env->NewGlobalRef(pObj);
  75     env->SetLongField(pObj, unpackerPtrFID, ptr2jlong(uPtr));
  76   }
  77   uPtr->jnienv = env;  // keep refreshing this in case of MT access
  78   return uPtr;
  79 }
  80 
  81 // This is the harder trick:  Pull the current state out of mid-air.
  82 static unpacker* get_unpacker() {
  83   //fprintf(stderr, "get_unpacker()\n");
  84   JavaVM* vm = null;
  85   JNI_GetCreatedJavaVMs(&vm, 1, null);

  86   void* envRaw = null;
  87   vm->GetEnv(&envRaw, JNI_VERSION_1_1);
  88   JNIEnv* env = (JNIEnv*) envRaw;
  89   //fprintf(stderr, "get_unpacker() env=%p\n", env);
  90   if (env == null)
  91     return null;
  92   jobject pObj = env->CallStaticObjectMethod(NIclazz, currentInstMID);
  93   //fprintf(stderr, "get_unpacker() pObj=%p\n", pObj);
  94   if (pObj == null)
  95     return null;
  96   // Got pObj and env; now do it the easy way.
  97   return get_unpacker(env, pObj);
  98 }
  99 
 100 static void free_unpacker(JNIEnv *env, jobject pObj, unpacker* uPtr) {
 101   if (uPtr != null) {
 102     //fprintf(stderr, "free_unpacker(%p) uPtr=%p\n", pObj, uPtr);
 103     env->DeleteGlobalRef((jobject) uPtr->jniobj);
 104     uPtr->jniobj = null;
 105     uPtr->free();




  65   if (uPtr == null) {
  66     if (noCreate)  return null;
  67     uPtr = new unpacker();
  68     if (uPtr == null) {
  69       THROW_IOE(ERROR_ENOMEM);
  70       return null;
  71     }
  72     //fprintf(stderr, "get_unpacker(%p) uPtr=%p initializing\n", pObj, uPtr);
  73     uPtr->init(read_input_via_jni);
  74     uPtr->jniobj = (void*) env->NewGlobalRef(pObj);
  75     env->SetLongField(pObj, unpackerPtrFID, ptr2jlong(uPtr));
  76   }
  77   uPtr->jnienv = env;  // keep refreshing this in case of MT access
  78   return uPtr;
  79 }
  80 
  81 // This is the harder trick:  Pull the current state out of mid-air.
  82 static unpacker* get_unpacker() {
  83   //fprintf(stderr, "get_unpacker()\n");
  84   JavaVM* vm = null;
  85   jsize nVM = 0;
  86   JNI_GetCreatedJavaVMs(&vm, 1, &nVM);
  87   void* envRaw = null;
  88   vm->GetEnv(&envRaw, JNI_VERSION_1_1);
  89   JNIEnv* env = (JNIEnv*) envRaw;
  90   //fprintf(stderr, "get_unpacker() env=%p\n", env);
  91   if (env == null)
  92     return null;
  93   jobject pObj = env->CallStaticObjectMethod(NIclazz, currentInstMID);
  94   //fprintf(stderr, "get_unpacker() pObj=%p\n", pObj);
  95   if (pObj == null)
  96     return null;
  97   // Got pObj and env; now do it the easy way.
  98   return get_unpacker(env, pObj);
  99 }
 100 
 101 static void free_unpacker(JNIEnv *env, jobject pObj, unpacker* uPtr) {
 102   if (uPtr != null) {
 103     //fprintf(stderr, "free_unpacker(%p) uPtr=%p\n", pObj, uPtr);
 104     env->DeleteGlobalRef((jobject) uPtr->jniobj);
 105     uPtr->jniobj = null;
 106     uPtr->free();