\r
}\r
\r
-JNIEXPORT jint JNICALL Java_org_simantics_fastlz_LZ4_compress(JNIEnv* env, jclass clazz, \r
- jobject input, jint inputOffset, jint length, \r
- jobject output, jint outputOffset) {\r
- void* inputAddress = (char*)(*env)->GetDirectBufferAddress(env, input) + inputOffset;\r
- void* outputAddress = (char*)(*env)->GetDirectBufferAddress(env, output) + outputOffset;\r
- return LZ4_compress(inputAddress, outputAddress, length);\r
-}\r
-\r
-JNIEXPORT jint JNICALL Java_org_simantics_fastlz_LZ4_decompress(JNIEnv* env, jclass clazz, \r
- jobject input, jint inputOffset, jint length, \r
- jobject output, jint outputOffset, jint maxout) {\r
- void* inputAddress = (char*)(*env)->GetDirectBufferAddress(env, input) + inputOffset;\r
- void* outputAddress = (char*)(*env)->GetDirectBufferAddress(env, output) + outputOffset;\r
- return LZ4_uncompress_unknownOutputSize(inputAddress, outputAddress, length, maxout);\r
-}\r
-\r
-JNIEXPORT jint JNICALL Java_org_simantics_fastlz_LZ4_decompressCluster(JNIEnv* env, jclass clazz, jobject deflated, jint deflatedSize, jint inflatedSize, jobjectArray arrays) {\r
-\r
- static char *inflateBuffer = 0;\r
- static int inflateBufferSize = 0;\r
-\r
- int ll, il, bl;\r
-\r
- jlongArray longs;\r
- jintArray ints;\r
- jbyteArray bytes;\r
-\r
- char *input = (char*)(*env)->GetDirectBufferAddress(env, deflated);\r
- char *address;\r
-\r
- if(inflateBufferSize < inflatedSize) {\r
- if(!inflateBuffer) {\r
- if(inflatedSize < INITIAL_SIZE) inflatedSize = INITIAL_SIZE;\r
- inflateBuffer = malloc(inflatedSize);\r
- inflateBufferSize = inflatedSize;\r
- } else {\r
- if(inflateBuffer) free(inflateBuffer);\r
- inflateBuffer = malloc(inflatedSize);\r
- inflateBufferSize = inflatedSize;\r
- }\r
- }\r
-\r
- address = inflateBuffer;\r
-\r
- LZ4_uncompress_unknownOutputSize(input, inflateBuffer, deflatedSize, inflateBufferSize);\r
-\r
- ll = *(int *)address;\r
- longs = (*env)->NewLongArray(env, ll);\r
- (*env)->SetLongArrayRegion(env, longs, 0, ll, (const jlong *)(address + 4));\r
- (*env)->SetObjectArrayElement(env, arrays, 0, longs);\r
-\r
- address += 4 + 8 * ll;\r
-\r
- il = *(int *)address;\r
- ints = (*env)->NewIntArray(env, il);\r
- (*env)->SetIntArrayRegion(env, ints, 0, il, (const jint *)(address + 4));\r
- (*env)->SetObjectArrayElement(env, arrays, 1, ints);\r
-\r
- address += 4 * il + 4;\r
-\r
- bl = *(int *)address;\r
- bytes = (*env)->NewByteArray(env, bl);\r
- (*env)->SetByteArrayRegion(env, bytes, 0, bl, (const jbyte *)(address + 4));\r
- (*env)->SetObjectArrayElement(env, arrays, 2, bytes);\r
-\r
- return 0;\r
-\r
-}\r