JNIEXPORT jbyteArray JNICALL Java_java_util_zip_ZipFile_inflateEntryImpl2 (JNIEnv * env, jobject recv, jlong descriptor, jstring entryName) { PORT_ACCESS_FROM_ENV (env); I_32 retval; HyZipFile *zipFile; HyZipEntry zipEntry; const char *entryCopy; jbyteArray buf; JCLZipFile *jclZipFile = (JCLZipFile *) (IDATA) descriptor; /* Build the zipFile */ if (jclZipFile == (void *) -1) { throwNewIllegalStateException (env, ""); return NULL; } zipFile = &(jclZipFile->hyZipFile); entryCopy = (*env)->GetStringUTFChars (env, entryName, NULL); if (entryCopy == NULL) return NULL; zip_initZipEntry (privatePortLibrary, &zipEntry); retval = zip_getZipEntry (privatePortLibrary, zipFile, &zipEntry, entryCopy, TRUE); (*env)->ReleaseStringUTFChars (env, entryName, entryCopy); if (retval) { zip_freeZipEntry (privatePortLibrary, &zipEntry); if (retval == ZIP_ERR_OUT_OF_MEMORY) throwNewOutOfMemoryError (env, ""); return NULL; } buf = (*env)->NewByteArray (env, zipEntry.uncompressedSize); if (!buf) { throwNewOutOfMemoryError (env, ""); return NULL; } retval = zip_getZipEntryData (privatePortLibrary, zipFile, &zipEntry, NULL, zipEntry.uncompressedSize); if (retval == 0) (*env)->SetByteArrayRegion (env, buf, 0, zipEntry.uncompressedSize, zipEntry.data); zip_freeZipEntry (privatePortLibrary, &zipEntry); if (!retval) return buf; if (retval == ZIP_ERR_OUT_OF_MEMORY) throwNewOutOfMemoryError (env, ""); else throwJavaZIOException (env, ""); return NULL; }
char* Read_Manifest(JavaVM *vm, JNIEnv *env,const char *jar_name){ I_32 retval; #ifndef HY_ZIP_API HyZipFile zipFile; HyZipEntry zipEntry; #else VMIZipFile zipFile; VMIZipEntry zipEntry; #endif char *result; int size = 0; char errorMessage[1024]; /* Reach for the VM interface */ VMI_ACCESS_FROM_JAVAVM(vm); PORT_ACCESS_FROM_JAVAVM(vm); #ifdef HY_ZIP_API VMIZipFunctionTable *zipFuncs = (*VMI)->GetZipFunctions(VMI); #endif /* HY_ZIP_API */ /* open zip file */ #ifndef HY_ZIP_API retval = zip_openZipFile(privatePortLibrary, (char *)jar_name, &zipFile, NULL); #else /* HY_ZIP_API */ retval = zipFuncs->zip_openZipFile(VMI, (char *)jar_name, &zipFile, 0); #endif /* HY_ZIP_API */ if(retval){ sprintf(errorMessage,"failed to open file:%s, %d\n", jar_name, retval); (*env)->FatalError(env, errorMessage); return NULL; } /* get manifest entry */ #ifndef HY_ZIP_API zip_initZipEntry(privatePortLibrary, &zipEntry); retval = zip_getZipEntry(privatePortLibrary, &zipFile, &zipEntry, "META-INF/MANIFEST.MF", TRUE); #else /* HY_ZIP_API */ zipFuncs->zip_initZipEntry(VMI, &zipEntry); retval = zipFuncs->zip_getZipEntry(VMI, &zipFile, &zipEntry, "META-INF/MANIFEST.MF", ZIP_FLAG_READ_DATA_POINTER); #endif /* HY_ZIP_API */ if (retval) { #ifndef HY_ZIP_API zip_freeZipEntry(PORTLIB, &zipEntry); #else /* HY_ZIP_API */ zipFuncs->zip_freeZipEntry(VMI, &zipEntry); #endif /* HY_ZIP_API */ sprintf(errorMessage,"failed to get entry: %d\n", retval); (*env)->FatalError(env, errorMessage); return NULL; } /* read bytes */ size = zipEntry.uncompressedSize; result = (char *)hymem_allocate_memory(size*sizeof(char) + 1); #ifndef HY_ZIP_API retval = zip_getZipEntryData(privatePortLibrary, &zipFile, &zipEntry, (unsigned char*)result, size); #else /* HY_ZIP_API */ retval = zipFuncs->zip_getZipEntryData(VMI, &zipFile, &zipEntry, (unsigned char*)result, size); #endif /* HY_ZIP_API */ if(retval){ #ifndef HY_ZIP_API zip_freeZipEntry(PORTLIB, &zipEntry); #else /* HY_ZIP_API */ zipFuncs->zip_freeZipEntry(VMI, &zipEntry); #endif /* HY_ZIP_API */ sprintf(errorMessage,"failed to get bytes from zip entry, %d\n", zipEntry.extraFieldLength); (*env)->FatalError(env, errorMessage); return NULL; } result[size] = '\0'; /* free resource */ #ifndef HY_ZIP_API zip_freeZipEntry(privatePortLibrary, &zipEntry); retval = zip_closeZipFile(privatePortLibrary, &zipFile); #else /* HY_ZIP_API */ zipFuncs->zip_freeZipEntry(VMI, &zipEntry); retval = zipFuncs->zip_closeZipFile(VMI, &zipFile); #endif /* HY_ZIP_API */ if (retval) { sprintf(errorMessage,"failed to close zip file: %s, %d\n", jar_name, retval); (*env)->FatalError(env, errorMessage); return NULL; } return result; }