Use ByteBuffer.allocateDirect(). If you use ByteBuffer.allocate() to create a byte buffer, JNI call GetDirectBufferAddress(jobject:ByteBuffer) returns NULL.

This commit is contained in:
Taro L. Saito 2011-03-30 13:44:21 +09:00
parent e39178e719
commit 23bc6f6438
3 changed files with 48 additions and 10 deletions

View File

@ -27,6 +27,11 @@ public class Snappy
*/ */
public static int compress(ByteBuffer uncompressed, ByteBuffer compressed) { public static int compress(ByteBuffer uncompressed, ByteBuffer compressed) {
if (!uncompressed.isDirect())
throw new IllegalArgumentException("input is not a direct buffer");
if (!compressed.isDirect())
throw new IllegalArgumentException("destination is not a direct buffer");
// input: uncompressed[pos(), limit()) // input: uncompressed[pos(), limit())
// output: compressed // output: compressed
int uPos = uncompressed.position(); int uPos = uncompressed.position();
@ -54,6 +59,11 @@ public class Snappy
*/ */
public static boolean decompress(ByteBuffer compressed, ByteBuffer decompressed) { public static boolean decompress(ByteBuffer compressed, ByteBuffer decompressed) {
if (!compressed.isDirect())
throw new IllegalArgumentException("input is not a direct buffer");
if (!decompressed.isDirect())
throw new IllegalArgumentException("destination is not a direct buffer");
int cPos = compressed.position(); int cPos = compressed.position();
int cLen = compressed.remaining(); int cLen = compressed.remaining();
@ -66,6 +76,9 @@ public class Snappy
} }
public static int getUncompressedLength(ByteBuffer compressed) { public static int getUncompressedLength(ByteBuffer compressed) {
if (!compressed.isDirect())
throw new IllegalArgumentException("input is not a direct buffer");
return SnappyNative.getUncompressedLength(compressed, compressed.position(), compressed.remaining()); return SnappyNative.getUncompressedLength(compressed, compressed.position(), compressed.remaining());
} }

View File

@ -16,8 +16,8 @@ JNIEXPORT jstring JNICALL Java_org_xerial_snappy_SnappyNative_nativeLibraryVersi
JNIEXPORT jint JNICALL Java_org_xerial_snappy_SnappyNative_rawCompress JNIEXPORT jint JNICALL Java_org_xerial_snappy_SnappyNative_rawCompress
(JNIEnv* env, jclass self, jobject uncompressed, jint upos, jint ulen, jobject compressed, jint cpos) (JNIEnv* env, jclass self, jobject uncompressed, jint upos, jint ulen, jobject compressed, jint cpos)
{ {
char* uncompressedBuffer = (char*) env->GetDirectBufferAddress(uncompressed); char* uncompressedBuffer = (char*) env->GetDirectBufferAddress(uncompressed) + upos;
char* compressedBuffer = (char*) env->GetDirectBufferAddress(compressed); char* compressedBuffer = (char*) env->GetDirectBufferAddress(compressed) + cpos;
size_t compressedLength; size_t compressedLength;
snappy::RawCompress(uncompressedBuffer, (size_t) ulen, compressedBuffer, &compressedLength); snappy::RawCompress(uncompressedBuffer, (size_t) ulen, compressedBuffer, &compressedLength);
@ -63,11 +63,11 @@ JNIEXPORT jint JNICALL Java_org_xerial_snappy_SnappyNative_getUncompressedLength
(JNIEnv * env, jclass self, jobject compressed, jint cpos, jint clen) (JNIEnv * env, jclass self, jobject compressed, jint cpos, jint clen)
{ {
char* compressedBuffer = (char*) env->GetDirectBufferAddress(compressed); char* compressedBuffer = (char*) env->GetDirectBufferAddress(compressed);
size_t result; if(compressedBuffer == 0)
std::string s = "hello world"; return (jint) -1;
//snappy::GetUncompressedLength(compressedBuffer, (size_t) clen, &result); compressedBuffer += cpos;
snappy::GetUncompressedLength(s.c_str(), s.length(), &result);
snappy::GetUncompressedLength(compressedBuffer, (size_t) clen, &result);
return (jint) result; return (jint) result;
} }

View File

@ -9,6 +9,8 @@
//-------------------------------------- //--------------------------------------
package org.xerial.snappy; package org.xerial.snappy;
import static org.junit.Assert.*;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import org.junit.Test; import org.junit.Test;
@ -24,17 +26,40 @@ public class SnappyTest
_logger.info("version: " + version); _logger.info("version: " + version);
} }
@Test
public void directBufferCheck() throws Exception {
try {
ByteBuffer src = ByteBuffer.allocate(1024);
src.put("hello world".getBytes());
src.flip();
ByteBuffer dest = ByteBuffer.allocate(1024);
int maxCompressedLen = Snappy.compress(src, dest);
}
catch (IllegalArgumentException e) {
// detected non-direct buffer. OK
return;
}
fail("shouldn't reach here");
}
@Test @Test
public void load() throws Exception { public void load() throws Exception {
ByteBuffer src = ByteBuffer.allocate(1024); ByteBuffer src = ByteBuffer.allocateDirect(1024);
src.put("hello world".getBytes()); src.put("hello world".getBytes());
ByteBuffer dest = ByteBuffer.allocate(1024);
src.flip(); src.flip();
int maxCompressedLen = Snappy.getMaxCompressedLength(src.remaining()); int maxCompressedLen = Snappy.getMaxCompressedLength(src.remaining());
_logger.info("max compressed length:" + maxCompressedLen); _logger.info("max compressed length:" + maxCompressedLen);
//long uncompressedLen = Snappy.getUncompressedLength(dest);
// int uncompressedLen = Snappy.getUncompressedLength(src);
_logger.info("uncompressed length: " + uncompressedLen);
ByteBuffer dest = ByteBuffer.allocateDirect(1024);
Snappy.compress(src, dest);
} }
} }