Files
commandergenius/project/jni/lzma/src/XZInputStream.c

66 lines
1.9 KiB
C

#include <stdarg.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <jni.h>
#include "lzma.h"
#include "jniwrapperstuff.h"
JNIEXPORT jlong JNICALL
JAVA_EXPORT_NAME(XZInputStream_nativeInit) (JNIEnv* env, jobject thiz)
{
lzma_stream * stream = (lzma_stream *) malloc(sizeof(lzma_stream));
lzma_stream tmp = LZMA_STREAM_INIT;
*stream = tmp;
int ret = lzma_stream_decoder(stream, UINT64_MAX, LZMA_CONCATENATED);
if (ret != LZMA_OK)
{
free(stream);
return 0;
}
return (jlong) (intptr_t) stream;
}
JNIEXPORT void JNICALL
JAVA_EXPORT_NAME(XZInputStream_nativeClose) (JNIEnv* env, jobject thiz, jlong nativeData)
{
lzma_stream * stream = (lzma_stream *) (intptr_t) nativeData;
lzma_end(stream);
}
JNIEXPORT jint JNICALL
JAVA_EXPORT_NAME(XZInputStream_nativeRead) (JNIEnv* env, jobject thiz, jlong nativeData,
jobject inBuf, jint inAvailable, jobject outBuf,
jint outCount, jobject offsets)
{
lzma_stream * stream = (lzma_stream *) (intptr_t) nativeData;
uint8_t *inBufNative = (uint8_t *) (*env)->GetPrimitiveArrayCritical(env, inBuf, NULL);
uint8_t *outBufNative = (uint8_t *) (*env)->GetPrimitiveArrayCritical(env, outBuf, NULL);
jint *offsetsNative = (jint *) (*env)->GetPrimitiveArrayCritical(env, offsets, NULL);
jint inOffset = offsetsNative[0];
jint outOffset = offsetsNative[1];
int ret;
stream->avail_in = inAvailable - inOffset;
stream->next_in = inBufNative + inOffset;
stream->avail_out = outCount;
stream->next_out = outBufNative + outOffset;
ret = lzma_code(stream, inAvailable == -1 ? LZMA_FINISH : LZMA_RUN);
(*env)->ReleasePrimitiveArrayCritical(env, offsets, offsetsNative, 0);
(*env)->ReleasePrimitiveArrayCritical(env, outBuf, outBufNative, 0);
(*env)->ReleasePrimitiveArrayCritical(env, inBuf, inBufNative, 0);
inOffset = inAvailable - stream->avail_in;
outOffset += outCount - stream->avail_out;
offsetsNative[0] = inOffset;
offsetsNative[1] = outOffset;
return ret;
}