151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/* 251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved. 351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This code is free software; you can redistribute it and/or modify it 651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * under the terms of the GNU General Public License version 2 only, as 751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * published by the Free Software Foundation. Oracle designates this 851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * particular file as subject to the "Classpath" exception as provided 951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * by Oracle in the LICENSE file that accompanied this code. 1051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 1151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This code is distributed in the hope that it will be useful, but WITHOUT 1251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 1351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 1451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * version 2 for more details (a copy is included in the LICENSE file that 1551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * accompanied this code). 1651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 1751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * You should have received a copy of the GNU General Public License version 1851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 2 along with this work; if not, write to the Free Software Foundation, 1951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 2051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 2151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 2251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * or visit www.oracle.com if you need additional information or have any 2351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * questions. 2451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 2551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 2651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/* 2751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Native method support for java.util.zip.Inflater 2851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 2951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 3051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski#include <stdio.h> 3151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski#include <stdlib.h> 3251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski#include <errno.h> 3351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski#include <string.h> 34a8ed084745590c5e4a0e8559b5821809d60fe242Piotr Jastrzebski#include "JNIHelp.h" 3551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski#include "jlong.h" 3651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski#include "jni.h" 3751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski#include "jvm.h" 3851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski#include "jni_util.h" 3951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski#include <zlib.h> 4051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 41a8ed084745590c5e4a0e8559b5821809d60fe242Piotr Jastrzebski#define NATIVE_METHOD(className, functionName, signature) \ 42a8ed084745590c5e4a0e8559b5821809d60fe242Piotr Jastrzebski{ #functionName, signature, (void*)(className ## _ ## functionName) } 43a8ed084745590c5e4a0e8559b5821809d60fe242Piotr Jastrzebski 4451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski#define ThrowDataFormatException(env, msg) \ 4551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski JNU_ThrowByName(env, "java/util/zip/DataFormatException", msg) 4651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 4751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskistatic jfieldID needDictID; 4851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskistatic jfieldID finishedID; 4951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskistatic jfieldID bufID, offID, lenID; 5051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 51d66fb8e8bb26b1d294a7c42d740acaf427a3a0a3Przemyslaw Szczepaniakstatic void Inflater_initIDs(JNIEnv *env) { 52d66fb8e8bb26b1d294a7c42d740acaf427a3a0a3Przemyslaw Szczepaniak jclass cls = (*env)->FindClass(env, "java/util/zip/Inflater"); 5351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski needDictID = (*env)->GetFieldID(env, cls, "needDict", "Z"); 5451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski finishedID = (*env)->GetFieldID(env, cls, "finished", "Z"); 5551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski bufID = (*env)->GetFieldID(env, cls, "buf", "[B"); 5651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski offID = (*env)->GetFieldID(env, cls, "off", "I"); 5751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski lenID = (*env)->GetFieldID(env, cls, "len", "I"); 5851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski} 5951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 6051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr JastrzebskiJNIEXPORT jlong JNICALL 61a8ed084745590c5e4a0e8559b5821809d60fe242Piotr JastrzebskiInflater_init(JNIEnv *env, jclass cls, jboolean nowrap) 6251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski{ 6351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski z_stream *strm = calloc(1, sizeof(z_stream)); 6451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 6551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (strm == 0) { 6651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski JNU_ThrowOutOfMemoryError(env, 0); 6751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return jlong_zero; 6851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } else { 6951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski char *msg; 7051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski switch (inflateInit2(strm, nowrap ? -MAX_WBITS : MAX_WBITS)) { 7151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski case Z_OK: 7251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return ptr_to_jlong(strm); 7351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski case Z_MEM_ERROR: 7451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski free(strm); 7551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski JNU_ThrowOutOfMemoryError(env, 0); 7651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return jlong_zero; 7751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski default: 7851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski msg = strm->msg; 7951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski free(strm); 8051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski JNU_ThrowInternalError(env, msg); 8151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return jlong_zero; 8251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 8351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 8451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski} 8551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 8651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr JastrzebskiJNIEXPORT void JNICALL 87a8ed084745590c5e4a0e8559b5821809d60fe242Piotr JastrzebskiInflater_setDictionary(JNIEnv *env, jclass cls, jlong addr, 8851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski jarray b, jint off, jint len) 8951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski{ 9051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski Bytef *buf = (*env)->GetPrimitiveArrayCritical(env, b, 0); 9151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski int res; 9251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (buf == 0) /* out of memory */ 9351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return; 9451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski res = inflateSetDictionary(jlong_to_ptr(addr), buf + off, len); 9551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski (*env)->ReleasePrimitiveArrayCritical(env, b, buf, 0); 9651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski switch (res) { 9751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski case Z_OK: 9851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski break; 9951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski case Z_STREAM_ERROR: 10051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski case Z_DATA_ERROR: 10151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski JNU_ThrowIllegalArgumentException(env, ((z_stream *)jlong_to_ptr(addr))->msg); 10251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski break; 10351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski default: 10451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski JNU_ThrowInternalError(env, ((z_stream *)jlong_to_ptr(addr))->msg); 10551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski break; 10651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 10751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski} 10851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 10951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr JastrzebskiJNIEXPORT jint JNICALL 110a8ed084745590c5e4a0e8559b5821809d60fe242Piotr JastrzebskiInflater_inflateBytes(JNIEnv *env, jobject this, jlong addr, 11151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski jarray b, jint off, jint len) 11251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski{ 11351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski z_stream *strm = jlong_to_ptr(addr); 11451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski jarray this_buf = (jarray)(*env)->GetObjectField(env, this, bufID); 11551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski jint this_off = (*env)->GetIntField(env, this, offID); 11651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski jint this_len = (*env)->GetIntField(env, this, lenID); 11751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 11851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski jbyte *in_buf; 11951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski jbyte *out_buf; 12051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski int ret; 12151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 12251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski in_buf = (*env)->GetPrimitiveArrayCritical(env, this_buf, 0); 12351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (in_buf == NULL) { 12451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (this_len != 0) 12551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski JNU_ThrowOutOfMemoryError(env, 0); 12651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return 0; 12751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 12851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski out_buf = (*env)->GetPrimitiveArrayCritical(env, b, 0); 12951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (out_buf == NULL) { 13051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski (*env)->ReleasePrimitiveArrayCritical(env, this_buf, in_buf, 0); 13151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (len != 0) 13251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski JNU_ThrowOutOfMemoryError(env, 0); 13351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return 0; 13451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 13551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski strm->next_in = (Bytef *) (in_buf + this_off); 13651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski strm->next_out = (Bytef *) (out_buf + off); 13751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski strm->avail_in = this_len; 13851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski strm->avail_out = len; 13951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski ret = inflate(strm, Z_PARTIAL_FLUSH); 14051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski (*env)->ReleasePrimitiveArrayCritical(env, b, out_buf, 0); 14151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski (*env)->ReleasePrimitiveArrayCritical(env, this_buf, in_buf, 0); 14251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 14351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski switch (ret) { 14451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski case Z_STREAM_END: 14551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski (*env)->SetBooleanField(env, this, finishedID, JNI_TRUE); 14651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /* fall through */ 14751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski case Z_OK: 14851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this_off += this_len - strm->avail_in; 14951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski (*env)->SetIntField(env, this, offID, this_off); 15051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski (*env)->SetIntField(env, this, lenID, strm->avail_in); 15151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return len - strm->avail_out; 15251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski case Z_NEED_DICT: 15351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski (*env)->SetBooleanField(env, this, needDictID, JNI_TRUE); 15451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /* Might have consumed some input here! */ 15551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this_off += this_len - strm->avail_in; 15651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski (*env)->SetIntField(env, this, offID, this_off); 15751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski (*env)->SetIntField(env, this, lenID, strm->avail_in); 15851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return 0; 15951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski case Z_BUF_ERROR: 16051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return 0; 16151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski case Z_DATA_ERROR: 16251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski ThrowDataFormatException(env, strm->msg); 16351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return 0; 16451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski case Z_MEM_ERROR: 16551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski JNU_ThrowOutOfMemoryError(env, 0); 16651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return 0; 16751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski default: 16851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski JNU_ThrowInternalError(env, strm->msg); 16951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return 0; 17051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 17151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski} 17251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 17351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr JastrzebskiJNIEXPORT jint JNICALL 174a8ed084745590c5e4a0e8559b5821809d60fe242Piotr JastrzebskiInflater_getAdler(JNIEnv *env, jclass cls, jlong addr) 17551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski{ 17651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return ((z_stream *)jlong_to_ptr(addr))->adler; 17751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski} 17851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 17951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr JastrzebskiJNIEXPORT void JNICALL 180a8ed084745590c5e4a0e8559b5821809d60fe242Piotr JastrzebskiInflater_reset(JNIEnv *env, jclass cls, jlong addr) 18151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski{ 18251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (inflateReset(jlong_to_ptr(addr)) != Z_OK) { 18351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski JNU_ThrowInternalError(env, 0); 18451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 18551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski} 18651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 18751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr JastrzebskiJNIEXPORT void JNICALL 188a8ed084745590c5e4a0e8559b5821809d60fe242Piotr JastrzebskiInflater_end(JNIEnv *env, jclass cls, jlong addr) 18951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski{ 19051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (inflateEnd(jlong_to_ptr(addr)) == Z_STREAM_ERROR) { 19151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski JNU_ThrowInternalError(env, 0); 19251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } else { 19351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski free(jlong_to_ptr(addr)); 19451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 19551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski} 196a8ed084745590c5e4a0e8559b5821809d60fe242Piotr Jastrzebski 197a8ed084745590c5e4a0e8559b5821809d60fe242Piotr Jastrzebskistatic JNINativeMethod gMethods[] = { 198a8ed084745590c5e4a0e8559b5821809d60fe242Piotr Jastrzebski NATIVE_METHOD(Inflater, init, "(Z)J"), 199a8ed084745590c5e4a0e8559b5821809d60fe242Piotr Jastrzebski NATIVE_METHOD(Inflater, setDictionary, "(J[BII)V"), 200a8ed084745590c5e4a0e8559b5821809d60fe242Piotr Jastrzebski NATIVE_METHOD(Inflater, inflateBytes, "(J[BII)I"), 201a8ed084745590c5e4a0e8559b5821809d60fe242Piotr Jastrzebski NATIVE_METHOD(Inflater, getAdler, "(J)I"), 202a8ed084745590c5e4a0e8559b5821809d60fe242Piotr Jastrzebski NATIVE_METHOD(Inflater, reset, "(J)V"), 203a8ed084745590c5e4a0e8559b5821809d60fe242Piotr Jastrzebski NATIVE_METHOD(Inflater, end, "(J)V"), 204a8ed084745590c5e4a0e8559b5821809d60fe242Piotr Jastrzebski}; 205a8ed084745590c5e4a0e8559b5821809d60fe242Piotr Jastrzebski 206a8ed084745590c5e4a0e8559b5821809d60fe242Piotr Jastrzebskivoid register_java_util_zip_Inflater(JNIEnv* env) { 207d66fb8e8bb26b1d294a7c42d740acaf427a3a0a3Przemyslaw Szczepaniak jniRegisterNativeMethods(env, "java/util/zip/Inflater", gMethods, NELEM(gMethods)); 208d66fb8e8bb26b1d294a7c42d740acaf427a3a0a3Przemyslaw Szczepaniak 209d66fb8e8bb26b1d294a7c42d740acaf427a3a0a3Przemyslaw Szczepaniak Inflater_initIDs(env); 210a8ed084745590c5e4a0e8559b5821809d60fe242Piotr Jastrzebski} 211