jint Java_de_illogical_modo_SpcDecoder_spcLoadFromZip(JNIEnv* env, jclass clazz, jstring zipfile, jstring entry) { char* data = NULL; int size = 0; char czipfile[1024]; char centry[1024]; memset(czipfile, 0, 1024); int clen = (*env)->GetStringLength(env, zipfile); if (clen > 1023) return 0; (*env)->GetStringUTFRegion(env, zipfile, 0, clen, czipfile); memset(centry, 0, 1024); clen = (*env)->GetStringLength(env, entry); if (clen > 1023) return 0; (*env)->GetStringUTFRegion(env, entry, 0, clen, centry); data = getUncompressedData(czipfile, centry, &size); if (data == NULL) return 0; // GME copies memory gme_err_t err = gme_open_data(data, size, &emu, 44100); free(data); if (err != NULL) { emu = NULL; } else { gme_start_track(emu, 0); } if (emu != NULL) return size; return 0; }
jint Java_de_illogical_modo_GmeDecoder_gmeLoadM3uFromZip(JNIEnv* env, jclass clazz, jstring zipfile, jstring entry) { char* m3udata; int size; char czipfile[1024]; char centry[1024]; if (emu == NULL) return 0; memset(czipfile, 0, 1024); int clen = (*env)->GetStringLength(env, zipfile); if (clen > 1023) return 0; (*env)->GetStringUTFRegion(env, zipfile, 0, clen, czipfile); memset(centry, 0, 1024); clen = (*env)->GetStringLength(env, entry); if (clen > 1023) return 0; (*env)->GetStringUTFRegion(env, entry, 0, clen, centry); m3udata = getUncompressedData(czipfile, centry, &size); if (m3udata == NULL) return 0; //__android_log_print(ANDROID_LOG_VERBOSE, "gme", "LoadM3uZip: %d %s ", size, centry); gme_err_t err = gme_load_m3u_data(emu, m3udata, size); free(m3udata); //__android_log_print(ANDROID_LOG_VERBOSE, "gme", "LoadM3uZip: %s", err == NULL ? "null" : err); return err == NULL; }
jint Java_de_illogical_modo_GmeDecoder_gmeLoadFromZip(JNIEnv* env, jclass clazz, jstring zipfile, jstring entry, int vgzfile) { char* data = NULL; int size = 0; char czipfile[1024]; char centry[1024]; memset(czipfile, 0, 1024); int clen = (*env)->GetStringLength(env, zipfile); if (clen > 1023) return 0; (*env)->GetStringUTFRegion(env, zipfile, 0, clen, czipfile); memset(centry, 0, 1024); clen = (*env)->GetStringLength(env, entry); if (clen > 1023) return 0; (*env)->GetStringUTFRegion(env, entry, 0, clen, centry); data = getUncompressedData(czipfile, centry, &size); if (data == NULL) return 0; // If its a .vgz file inflate it. Problem is, can go up to 10MB. GME copies data = 20MB. // kss can also be gzip if (size > 10 && data[0] == 0x1F && data[1] == 0x8B) { unsigned long uncompressed_size = data[size-1] << 24 | data[size-2] << 16 | data[size-3] << 8 | data[size-4]; char* inflatebuffer = malloc(uncompressed_size); if (inflatebuffer != NULL) { int err; z_stream zs; zs.zalloc = Z_NULL; zs.zfree = Z_NULL; zs.opaque = Z_NULL; zs.next_in = data; zs.avail_in = size; zs.next_out = inflatebuffer; zs.avail_out = uncompressed_size; inflateInit2(&zs, 16 + MAX_WBITS); err = inflate(&zs, Z_FINISH); if (err == Z_STREAM_END) { //__android_log_print(ANDROID_LOG_VERBOSE, "gme", "-> ZLIB STREAM END - extracted Bytes %ld", zs.total_out); size = zs.total_out; free(data); data = inflatebuffer; } else { free(inflatebuffer); } inflateEnd(&zs); } } // GME copies memory gme_err_t err = gme_open_data(data, size, &emu, 44100); free(data); if (err != NULL) { emu = NULL; } else { gme_start_track(emu, 0); gme_set_stereo_depth(emu, depth); } if (emu != NULL) return size; return 0; }