package yuku.snappy.codec; class SnappyImplNative extends Snappy { private long nativeObj = 0; static { System.loadLibrary("snappy"); } public SnappyImplNative() { nativeObj = nativeSetup(); } @Override public String getImplementationName() { return "native"; } private static native long nativeSetup(); private static native int nativeCompress(long obj, byte[] in, int inOffset, byte[] out, int outOffset, int len); private static native int nativeDecompress(long obj, byte[] in, int inOffset, byte[] out, int outOffset, int len); @Override public int compress(byte[] in, int inOffset, byte[] out, int outOffset, int len) { int ret = nativeCompress(nativeObj, in, inOffset, out, outOffset, len); if (ret == -2) throw new IllegalArgumentException("SNAPPY_BUFFER_TOO_SMALL"); return ret; } @Override public int decompress(byte[] in, int inOffset, byte[] out, int outOffset, int len) { int ret = nativeDecompress(nativeObj, in, inOffset, out, outOffset, len); if (ret == -1) throw new IllegalArgumentException("SNAPPY_INVALID_INPUT"); if (ret == -2) throw new IllegalArgumentException("SNAPPY_BUFFER_TOO_SMALL"); // OK int res = uncompressedLength(in, inOffset, len); return res; } }