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