diff --git a/Makefile b/Makefile
index 1905219..635aaa7 100755
--- a/Makefile
+++ b/Makefile
@@ -17,9 +17,10 @@ $(TARGET)/snappy-$(VERSION): $(SNAPPY_ARCHIVE)
 	tar xvfz $< -C $(TARGET)
 
 
-$(SRC)/org/xerial/snappy/SnappyNative.h: $(SRC)/org/xerial/snappy/Snappy.java
-	javah -classpath $(TARGET)/classes -o $@ org.xerial.snappy.Snappy
+jni-header: $(SRC)/org/xerial/snappy/SnappyNative.h
 
+$(SRC)/org/xerial/snappy/SnappyNative.h: $(SRC)/org/xerial/snappy/SnappyNative.java
+	$(JAVAH) -classpath $(TARGET)/classes -o $@ org.xerial.snappy.SnappyNative
 
 
 $(SNAPPY_OUT)/%.o : $(TARGET)/snappy-$(VERSION)/%.cc 
@@ -46,5 +47,6 @@ snappy: $(NATIVE_DLL)
 $(NATIVE_DLL): $(SNAPPY_OUT)/$(LIBNAME)
 	@mkdir -p $(@D)
 	cp $< $@
+	cp $< $(TARGET)/classes/org/xerial/snappy/native/$(OS_NAME)/$(OS_ARCH)/$(LIBNAME)
 
 
diff --git a/lib/include/byteswap.h b/lib/include/byteswap.h
deleted file mode 100644
index cd5a726..0000000
--- a/lib/include/byteswap.h
+++ /dev/null
@@ -1,39 +0,0 @@
-/* byteswap.h
-
-Copyright 2005 Red Hat, Inc.
-
-This file is part of Cygwin.
-
-This software is a copyrighted work licensed under the terms of the
-Cygwin license.  Please consult the file "CYGWIN_LICENSE" for
-details. */
-
-#ifndef _BYTESWAP_H
-#define _BYTESWAP_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-static __inline unsigned short
-bswap_16 (unsigned short __x)
-{
-  return (__x >> 8) | (__x << 8);
-}
-
-static __inline unsigned int
-bswap_32 (unsigned int __x)
-{
-  return (bswap_16 (__x & 0xffff) << 16) | (bswap_16 (__x >> 16));
-}
-
-static __inline unsigned long long
-bswap_64 (unsigned long long __x)
-{
-  return (((unsigned long long) bswap_32 (__x & 0xffffffffull)) << 32) | (bswap_32 (__x >> 32));
-}
-
-#ifdef __cplusplus
-}
-#endif
-#endif /* _BYTESWAP_H */
diff --git a/lib/include/config.h b/lib/include/config.h
new file mode 100644
index 0000000..e69de29
diff --git a/src/main/java/org/xerial/snappy/Snappy.java b/src/main/java/org/xerial/snappy/Snappy.java
index 5c0d75a..3f5ec90 100755
--- a/src/main/java/org/xerial/snappy/Snappy.java
+++ b/src/main/java/org/xerial/snappy/Snappy.java
@@ -13,25 +13,64 @@ import java.nio.ByteBuffer;
 
 public class Snappy
 {
-    static {
-        LoadSnappy.initialize();
+
+    public static String getNativeLibraryVersion() {
+        return SnappyNative.nativeLibraryVersion();
     }
 
-    public native static String nativeLibraryVersion();
+    /**
+     * @param uncompressed
+     *            input is at buffer[pos() ... limit())
+     * @param compressed
+     *            output compressed data to buffer[pos()]
+     * @return byte size of the compressed data
+     */
+    public static int compress(ByteBuffer uncompressed, ByteBuffer compressed) {
 
-    // ------------------------------------------------------------------------
-    // Generic compression/decompression routines.
-    // ------------------------------------------------------------------------
+        // input: uncompressed[pos(), limit())
+        // output: compressed
+        int uPos = uncompressed.position();
+        int uLen = uncompressed.remaining();
+        int compressedSize = SnappyNative.rawCompress(uncompressed, uPos, uLen, compressed, compressed.position());
 
-    public native static long compress(ByteBuffer uncompressed, ByteBuffer compressed);
+        //            pos      limit
+        // [ ....XXXXXX.........]
+        uncompressed.limit(uncompressed.capacity());
+        uncompressed.position(uPos + uLen);
 
-    public native static boolean uncompress(ByteBuffer compressed, ByteBuffer uncompressed);
+        //         pos  limit
+        // [ ......BBBBBBB.........]
+        compressed.limit(compressed.position() + compressedSize);
 
-    // Returns the maximal size of the compressed representation of
-    // input data that is "source_bytes" bytes in length;
-    public native static long maxCompressedLength(long source_bytes);
+        return compressedSize;
+    }
 
-    // This operation takes O(1) time.
-    public native static long getUncompressedLength(ByteBuffer compressed);
+    /**
+     * @param compressed
+     *            input is at buffer[pos() ... limit())
+     * @param decompressed
+     *            output decompressed data to buffer[pot())
+     * @return
+     */
+    public static boolean decompress(ByteBuffer compressed, ByteBuffer decompressed) {
+
+        int cPos = compressed.position();
+        int cLen = compressed.remaining();
+
+        boolean ret = SnappyNative.rawDecompress(compressed, cPos, cLen, decompressed, decompressed.position());
+
+        compressed.limit(compressed.capacity());
+        compressed.position(cPos + cLen);
+
+        return ret;
+    }
+
+    public static int getUncompressedLength(ByteBuffer compressed) {
+        return SnappyNative.getUncompressedLength(compressed, compressed.position(), compressed.remaining());
+    }
+
+    public static int getMaxCompressedLength(int byteSize) {
+        return SnappyNative.maxCompressedLength(byteSize);
+    }
 
 }
diff --git a/src/main/java/org/xerial/snappy/SnappyNative.cpp b/src/main/java/org/xerial/snappy/SnappyNative.cpp
index a84beb8..db0e7f0 100755
--- a/src/main/java/org/xerial/snappy/SnappyNative.cpp
+++ b/src/main/java/org/xerial/snappy/SnappyNative.cpp
@@ -1,7 +1,8 @@
+#include <string>
 #include <snappy.h>
 #include "SnappyNative.h"
 
-JNIEXPORT jstring JNICALL Java_org_xerial_snappy_Snappy_nativeLibraryVersion
+JNIEXPORT jstring JNICALL Java_org_xerial_snappy_SnappyNative_nativeLibraryVersion
   (JNIEnv * env, jclass self)
 {
 	return env->NewStringUTF("1.0.1");
@@ -12,13 +13,15 @@ JNIEXPORT jstring JNICALL Java_org_xerial_snappy_Snappy_nativeLibraryVersion
  * Method:    compress
  * Signature: (Ljava/nio/ByteBuffer;Ljava/nio/ByteBuffer;)J
  */
-JNIEXPORT jlong JNICALL Java_org_xerial_snappy_Snappy_compress
-  (JNIEnv* env, jclass self, jobject uncompressed, jobject compressed)
+JNIEXPORT jint JNICALL Java_org_xerial_snappy_SnappyNative_rawCompress
+  (JNIEnv* env, jclass self, jobject uncompressed, jint upos, jint ulen, jobject compressed, jint cpos)
 {
-	void* uncompressedBuffer = env->GetDirectBufferAddress(uncompressed);
+	char* uncompressedBuffer = (char*) env->GetDirectBufferAddress(uncompressed);
+	char* compressedBuffer = (char*) env->GetDirectBufferAddress(compressed);
+	size_t compressedLength;
 
-
-	return (jlong) 0;
+	snappy::RawCompress(uncompressedBuffer, (size_t) ulen, compressedBuffer, &compressedLength);
+	return (jint) compressedLength;
 }
 
 /*
@@ -26,11 +29,17 @@ JNIEXPORT jlong JNICALL Java_org_xerial_snappy_Snappy_compress
  * Method:    uncompress
  * Signature: (Ljava/nio/ByteBuffer;Ljava/nio/ByteBuffer;)Z
  */
-JNIEXPORT jboolean JNICALL Java_org_xerial_snappy_Snappy_uncompress
-  (JNIEnv *, jclass, jobject, jobject)
+JNIEXPORT jboolean JNICALL Java_org_xerial_snappy_SnappyNative_rawDecompress
+  (JNIEnv * env, jclass self, jobject compressed, jint cpos, jint clen, jobject decompressed, jint dpos)
 {
+	char* compressedBuffer = (char*) env->GetDirectBufferAddress(compressed) + cpos;
+	char* decompressedBuffer = (char*) env->GetDirectBufferAddress(decompressed) + dpos;
 
-	return (jboolean) true;
+	size_t decompressedLength;
+	snappy::GetUncompressedLength(compressedBuffer, (size_t) clen, &decompressedLength);
+	bool ret = snappy::RawUncompress(compressedBuffer, (size_t) clen, decompressedBuffer);
+
+	return (jboolean) ret;
 }
 
 /*
@@ -38,11 +47,11 @@ JNIEXPORT jboolean JNICALL Java_org_xerial_snappy_Snappy_uncompress
  * Method:    maxCompressedLength
  * Signature: (J)J
  */
-JNIEXPORT jlong JNICALL Java_org_xerial_snappy_Snappy_maxCompressedLength
-  (JNIEnv *, jclass, jlong)
+JNIEXPORT jint JNICALL Java_org_xerial_snappy_SnappyNative_maxCompressedLength
+  (JNIEnv *, jclass, jint size)
 {
-
-	return (jlong) 0;
+	size_t l = snappy::MaxCompressedLength((size_t) size);
+	return (jint) l;
 }
 
 /*
@@ -50,11 +59,16 @@ JNIEXPORT jlong JNICALL Java_org_xerial_snappy_Snappy_maxCompressedLength
  * Method:    getUncompressedLength
  * Signature: (Ljava/nio/ByteBuffer;)J
  */
-JNIEXPORT jlong JNICALL Java_org_xerial_snappy_Snappy_getUncompressedLength
-  (JNIEnv *, jclass, jobject)
+JNIEXPORT jint JNICALL Java_org_xerial_snappy_SnappyNative_getUncompressedLength
+  (JNIEnv * env, jclass self, jobject compressed, jint cpos, jint clen)
 {
+	char* compressedBuffer = (char*) env->GetDirectBufferAddress(compressed);
+	size_t result;
+	std::string s = "hello world";
+	//snappy::GetUncompressedLength(compressedBuffer, (size_t) clen, &result);
+	snappy::GetUncompressedLength(s.c_str(), s.length(), &result);
 
-	return (jlong) 0;
+	return (jint) result;
 }
 
 
diff --git a/src/main/java/org/xerial/snappy/SnappyNative.h b/src/main/java/org/xerial/snappy/SnappyNative.h
index 227d49d..a4287c8 100755
--- a/src/main/java/org/xerial/snappy/SnappyNative.h
+++ b/src/main/java/org/xerial/snappy/SnappyNative.h
@@ -1,51 +1,51 @@
 /* DO NOT EDIT THIS FILE - it is machine generated */
 #include <jni.h>
-/* Header for class org_xerial_snappy_Snappy */
+/* Header for class org_xerial_snappy_SnappyNative */
 
-#ifndef _Included_org_xerial_snappy_Snappy
-#define _Included_org_xerial_snappy_Snappy
+#ifndef _Included_org_xerial_snappy_SnappyNative
+#define _Included_org_xerial_snappy_SnappyNative
 #ifdef __cplusplus
 extern "C" {
 #endif
 /*
- * Class:     org_xerial_snappy_Snappy
+ * Class:     org_xerial_snappy_SnappyNative
  * Method:    nativeLibraryVersion
  * Signature: ()Ljava/lang/String;
  */
-JNIEXPORT jstring JNICALL Java_org_xerial_snappy_Snappy_nativeLibraryVersion
+JNIEXPORT jstring JNICALL Java_org_xerial_snappy_SnappyNative_nativeLibraryVersion
   (JNIEnv *, jclass);
 
 /*
- * Class:     org_xerial_snappy_Snappy
- * Method:    compress
- * Signature: (Ljava/nio/ByteBuffer;Ljava/nio/ByteBuffer;)J
+ * Class:     org_xerial_snappy_SnappyNative
+ * Method:    rawCompress
+ * Signature: (Ljava/nio/ByteBuffer;IILjava/nio/ByteBuffer;I)I
  */
-JNIEXPORT jlong JNICALL Java_org_xerial_snappy_Snappy_compress
-  (JNIEnv *, jclass, jobject, jobject);
+JNIEXPORT jint JNICALL Java_org_xerial_snappy_SnappyNative_rawCompress
+  (JNIEnv *, jclass, jobject, jint, jint, jobject, jint);
 
 /*
- * Class:     org_xerial_snappy_Snappy
- * Method:    uncompress
- * Signature: (Ljava/nio/ByteBuffer;Ljava/nio/ByteBuffer;)Z
+ * Class:     org_xerial_snappy_SnappyNative
+ * Method:    rawDecompress
+ * Signature: (Ljava/nio/ByteBuffer;IILjava/nio/ByteBuffer;I)Z
  */
-JNIEXPORT jboolean JNICALL Java_org_xerial_snappy_Snappy_uncompress
-  (JNIEnv *, jclass, jobject, jobject);
+JNIEXPORT jboolean JNICALL Java_org_xerial_snappy_SnappyNative_rawDecompress
+  (JNIEnv *, jclass, jobject, jint, jint, jobject, jint);
 
 /*
- * Class:     org_xerial_snappy_Snappy
+ * Class:     org_xerial_snappy_SnappyNative
  * Method:    maxCompressedLength
- * Signature: (J)J
+ * Signature: (I)I
  */
-JNIEXPORT jlong JNICALL Java_org_xerial_snappy_Snappy_maxCompressedLength
-  (JNIEnv *, jclass, jlong);
+JNIEXPORT jint JNICALL Java_org_xerial_snappy_SnappyNative_maxCompressedLength
+  (JNIEnv *, jclass, jint);
 
 /*
- * Class:     org_xerial_snappy_Snappy
+ * Class:     org_xerial_snappy_SnappyNative
  * Method:    getUncompressedLength
- * Signature: (Ljava/nio/ByteBuffer;)J
+ * Signature: (Ljava/nio/ByteBuffer;II)I
  */
-JNIEXPORT jlong JNICALL Java_org_xerial_snappy_Snappy_getUncompressedLength
-  (JNIEnv *, jclass, jobject);
+JNIEXPORT jint JNICALL Java_org_xerial_snappy_SnappyNative_getUncompressedLength
+  (JNIEnv *, jclass, jobject, jint, jint);
 
 #ifdef __cplusplus
 }
diff --git a/src/main/java/org/xerial/snappy/SnappyNative.java b/src/main/java/org/xerial/snappy/SnappyNative.java
new file mode 100755
index 0000000..2195a21
--- /dev/null
+++ b/src/main/java/org/xerial/snappy/SnappyNative.java
@@ -0,0 +1,38 @@
+//--------------------------------------
+// snappy-java Project
+//
+// SnappyNative.java
+// Since: 2011/03/30
+//
+// $URL$ 
+// $Author$
+//--------------------------------------
+package org.xerial.snappy;
+
+import java.nio.ByteBuffer;
+
+public class SnappyNative
+{
+    static {
+        LoadSnappy.initialize();
+    }
+
+    public native static String nativeLibraryVersion();
+
+    // ------------------------------------------------------------------------
+    // Generic compression/decompression routines.
+    // ------------------------------------------------------------------------
+    public native static int rawCompress(ByteBuffer input, int inputOffset, int inputLength, ByteBuffer compressed,
+            int outputOffset);
+
+    public native static boolean rawDecompress(ByteBuffer compressed, int inputOffset, int inputLength,
+            ByteBuffer uncompressed, int outputOffset);
+
+    // Returns the maximal size of the compressed representation of
+    // input data that is "source_bytes" bytes in length;
+    public native static int maxCompressedLength(int source_bytes);
+
+    // This operation takes O(1) time.
+    public native static int getUncompressedLength(ByteBuffer compressed, int offset, int len);
+
+}
diff --git a/src/test/java/org/xerial/snappy/SnappyTest.java b/src/test/java/org/xerial/snappy/SnappyTest.java
index 13a27ce..97d6bc8 100755
--- a/src/test/java/org/xerial/snappy/SnappyTest.java
+++ b/src/test/java/org/xerial/snappy/SnappyTest.java
@@ -20,7 +20,7 @@ public class SnappyTest
 
     @Test
     public void getVersion() throws Exception {
-        String version = Snappy.nativeLibraryVersion();
+        String version = Snappy.getNativeLibraryVersion();
         _logger.info("version: " + version);
     }
 
@@ -30,9 +30,11 @@ public class SnappyTest
         ByteBuffer src = ByteBuffer.allocate(1024);
         src.put("hello world".getBytes());
         ByteBuffer dest = ByteBuffer.allocate(1024);
-        Snappy.compress(src, dest);
 
-        long uncompressedLen = Snappy.getUncompressedLength(dest);
-        _logger.info("uncompressed length:" + uncompressedLen);
+        src.flip();
+        int maxCompressedLen = Snappy.getMaxCompressedLength(src.remaining());
+        _logger.info("max compressed length:" + maxCompressedLen);
+        //long uncompressedLen = Snappy.getUncompressedLength(dest);
+        //
     }
 }