Update issue 28

A workaround to postpone the initialization of SnappyNativeAPI.
This commit is contained in:
Taro L. Saito 2011-09-09 11:16:28 +09:00
parent 2906673651
commit f2fe1d3d8b
5 changed files with 53 additions and 35 deletions

View File

@ -1 +1 @@
acd53350367363d747e66caae0fe53b3d575ba4a wiki
0fb78fe3d92a2ff45ab3edb3d821d93619e43663 wiki

View File

@ -36,12 +36,20 @@ import java.nio.ByteBuffer;
*/
public class Snappy
{
private static SnappyNativeAPI impl;
static {
impl = SnappyLoader.load();
try {
impl = SnappyLoader.load();
}
catch (Exception e) {
e.printStackTrace();
}
}
/**
* An instance of SnappyNativeAPI
*/
private static Object impl;
/**
* Copy bytes from source to destination
*
@ -59,7 +67,7 @@ public class Snappy
*/
public static void arrayCopy(Object src, int offset, int byteLength, Object dest, int dest_offset)
throws IOException {
impl.arrayCopy(src, offset, byteLength, dest, dest_offset);
((SnappyNativeAPI) impl).arrayCopy(src, offset, byteLength, dest, dest_offset);
}
/**
@ -120,7 +128,8 @@ public class Snappy
// output: compressed
int uPos = uncompressed.position();
int uLen = uncompressed.remaining();
int compressedSize = impl.rawCompress(uncompressed, uPos, uLen, compressed, compressed.position());
int compressedSize = ((SnappyNativeAPI) impl).rawCompress(uncompressed, uPos, uLen, compressed,
compressed.position());
// pos limit
// [ ......BBBBBBB.........]
@ -173,7 +182,7 @@ public class Snappy
* @return native library version
*/
public static String getNativeLibraryVersion() {
return impl.nativeLibraryVersion();
return ((SnappyNativeAPI) impl).nativeLibraryVersion();
}
/**
@ -185,7 +194,7 @@ public class Snappy
public static boolean isValidCompressedBuffer(byte[] input, int offset, int length) throws IOException {
if (input == null)
throw new NullPointerException("input is null");
return impl.isValidCompressedBuffer(input, offset, length);
return ((SnappyNativeAPI) impl).isValidCompressedBuffer(input, offset, length);
}
/**
@ -205,7 +214,8 @@ public class Snappy
* factor of four faster than actual decompression.
*/
public static boolean isValidCompressedBuffer(ByteBuffer compressed) throws IOException {
return impl.isValidCompressedBuffer(compressed, compressed.position(), compressed.remaining());
return ((SnappyNativeAPI) impl).isValidCompressedBuffer(compressed, compressed.position(),
compressed.remaining());
}
/**
@ -217,7 +227,7 @@ public class Snappy
* @return maximum byte size of the compressed data
*/
public static int maxCompressedLength(int byteSize) {
return impl.maxCompressedLength(byteSize);
return ((SnappyNativeAPI) impl).maxCompressedLength(byteSize);
}
/**
@ -231,7 +241,7 @@ public class Snappy
*/
public static byte[] rawCompress(Object data, int byteSize) {
byte[] buf = new byte[Snappy.maxCompressedLength(byteSize)];
int compressedByteSize = impl.rawCompress(data, 0, byteSize, buf, 0);
int compressedByteSize = ((SnappyNativeAPI) impl).rawCompress(data, 0, byteSize, buf, 0);
byte[] result = new byte[compressedByteSize];
System.arraycopy(buf, 0, result, 0, compressedByteSize);
return result;
@ -259,7 +269,8 @@ public class Snappy
if (input == null || output == null)
throw new NullPointerException("input or output is null");
int compressedSize = impl.rawCompress(input, inputOffset, inputLength, output, outputOffset);
int compressedSize = ((SnappyNativeAPI) impl)
.rawCompress(input, inputOffset, inputLength, output, outputOffset);
return compressedSize;
}
@ -290,7 +301,7 @@ public class Snappy
throws IOException {
if (input == null || output == null)
throw new NullPointerException("input or output is null");
return impl.rawUncompress(input, inputOffset, inputLength, output, outputOffset);
return ((SnappyNativeAPI) impl).rawUncompress(input, inputOffset, inputLength, output, outputOffset);
}
/**
@ -362,7 +373,8 @@ public class Snappy
// pos limit
// [ ......UUUUUU.........]
int decompressedSize = impl.rawUncompress(compressed, cPos, cLen, uncompressed, uncompressed.position());
int decompressedSize = ((SnappyNativeAPI) impl).rawUncompress(compressed, cPos, cLen, uncompressed,
uncompressed.position());
uncompressed.limit(uncompressed.position() + decompressedSize);
return decompressedSize;
@ -375,14 +387,14 @@ public class Snappy
public static char[] uncompressCharArray(byte[] input, int offset, int length) throws IOException {
int uncompressedLength = Snappy.uncompressedLength(input, offset, length);
char[] result = new char[uncompressedLength / 2];
int byteSize = impl.rawUncompress(input, offset, length, result, 0);
int byteSize = ((SnappyNativeAPI) impl).rawUncompress(input, offset, length, result, 0);
return result;
}
public static double[] uncompressDoubleArray(byte[] input) throws IOException {
int uncompressedLength = Snappy.uncompressedLength(input, 0, input.length);
double[] result = new double[uncompressedLength / 8];
int byteSize = impl.rawUncompress(input, 0, input.length, result, 0);
int byteSize = ((SnappyNativeAPI) impl).rawUncompress(input, 0, input.length, result, 0);
return result;
}
@ -397,7 +409,7 @@ public class Snappy
* {@link SnappyErrorCode#PARSING_ERROR}
*/
public static int uncompressedLength(byte[] input) throws IOException {
return impl.uncompressedLength(input, 0, input.length);
return ((SnappyNativeAPI) impl).uncompressedLength(input, 0, input.length);
}
/**
@ -416,7 +428,7 @@ public class Snappy
if (input == null)
throw new NullPointerException("input is null");
return impl.uncompressedLength(input, offset, length);
return ((SnappyNativeAPI) impl).uncompressedLength(input, offset, length);
}
/**
@ -436,7 +448,7 @@ public class Snappy
if (!compressed.isDirect())
throw new SnappyError(SnappyErrorCode.NOT_A_DIRECT_BUFFER, "input is not a direct buffer");
return impl.uncompressedLength(compressed, compressed.position(), compressed.remaining());
return ((SnappyNativeAPI) impl).uncompressedLength(compressed, compressed.position(), compressed.remaining());
}
public static float[] uncompressFloatArray(byte[] input) throws IOException {
@ -446,7 +458,7 @@ public class Snappy
public static float[] uncompressFloatArray(byte[] input, int offset, int length) throws IOException {
int uncompressedLength = Snappy.uncompressedLength(input, offset, length);
float[] result = new float[uncompressedLength / 4];
int byteSize = impl.rawUncompress(input, offset, length, result, 0);
int byteSize = ((SnappyNativeAPI) impl).rawUncompress(input, offset, length, result, 0);
return result;
}
@ -457,7 +469,7 @@ public class Snappy
public static int[] uncompressIntArray(byte[] input, int offset, int length) throws IOException {
int uncompressedLength = Snappy.uncompressedLength(input, offset, length);
int[] result = new int[uncompressedLength / 4];
int byteSize = impl.rawUncompress(input, offset, length, result, 0);
int byteSize = ((SnappyNativeAPI) impl).rawUncompress(input, offset, length, result, 0);
return result;
}
@ -468,7 +480,7 @@ public class Snappy
public static long[] uncompressLongArray(byte[] input, int offset, int length) throws IOException {
int uncompressedLength = Snappy.uncompressedLength(input, offset, length);
long[] result = new long[uncompressedLength / 8];
int byteSize = impl.rawUncompress(input, offset, length, result, 0);
int byteSize = ((SnappyNativeAPI) impl).rawUncompress(input, offset, length, result, 0);
return result;
}
@ -479,7 +491,7 @@ public class Snappy
public static short[] uncompressShortArray(byte[] input, int offset, int length) throws IOException {
int uncompressedLength = Snappy.uncompressedLength(input, offset, length);
short[] result = new short[uncompressedLength / 2];
int byteSize = impl.rawUncompress(input, offset, length, result, 0);
int byteSize = ((SnappyNativeAPI) impl).rawUncompress(input, offset, length, result, 0);
return result;
}

View File

@ -85,15 +85,15 @@ import java.util.Properties;
*/
public class SnappyLoader
{
public static final String SNAPPY_SYSTEM_PROPERTIES_FILE = "org-xerial-snappy.properties";
public static final String KEY_SNAPPY_LIB_PATH = "org.xerial.snappy.lib.path";
public static final String KEY_SNAPPY_LIB_NAME = "org.xerial.snappy.lib.name";
public static final String KEY_SNAPPY_TEMPDIR = "org.xerial.snappy.tempdir";
public static final String KEY_SNAPPY_USE_SYSTEMLIB = "org.xerial.snappy.use.systemlib";
public static final String KEY_SNAPPY_DISABLE_BUNDLED_LIBS = "org.xerial.snappy.disable.bundled.libs"; // Depreciated, but preserved for backward compatibility
public static final String SNAPPY_SYSTEM_PROPERTIES_FILE = "org-xerial-snappy.properties";
public static final String KEY_SNAPPY_LIB_PATH = "org.xerial.snappy.lib.path";
public static final String KEY_SNAPPY_LIB_NAME = "org.xerial.snappy.lib.name";
public static final String KEY_SNAPPY_TEMPDIR = "org.xerial.snappy.tempdir";
public static final String KEY_SNAPPY_USE_SYSTEMLIB = "org.xerial.snappy.use.systemlib";
public static final String KEY_SNAPPY_DISABLE_BUNDLED_LIBS = "org.xerial.snappy.disable.bundled.libs"; // Depreciated, but preserved for backward compatibility
private static boolean isLoaded = false;
private static SnappyNativeAPI api = null;
private static boolean isLoaded = false;
private static Object api = null;
/**
* load system properties when configuration file of the name
@ -205,7 +205,7 @@ public class SnappyLoader
*
* @return
*/
static synchronized SnappyNativeAPI load() {
static synchronized Object load() {
if (api != null)
return api;
@ -220,7 +220,8 @@ public class SnappyLoader
isLoaded = true;
// Look up SnappyNative, injected to the root classloder, using reflection in order to avoid the initialization of SnappyNative class in this context class loader.
api = (SnappyNativeAPI) Class.forName("org.xerial.snappy.SnappyNative").newInstance();
Object nativeCode = Class.forName("org.xerial.snappy.SnappyNative").newInstance();
api = nativeCode;
}
catch (Exception e) {
e.printStackTrace();

View File

@ -33,8 +33,8 @@ import java.nio.ByteBuffer;
* SnappyNative.cpp
*
* <p>
* <b> DO NOT USE THIS CLASS DIRECTLY since the direct use of this class might
* break the native library code loading in {@link SnappyLoader}. </b>
* <b> DO NOT USE THIS CLASS since the direct use of this class might break the
* native library code loading in {@link SnappyLoader}. </b>
* </p>
*
* @author leo

View File

@ -115,6 +115,11 @@ public class SnappyLoaderTest
_logger.debug(Snappy.getNativeLibraryVersion());
}
@Test
public void autoLoad() throws Exception {
_logger.debug(Snappy.getNativeLibraryVersion());
}
public static void main(String[] args) {
// Test for loading native library specified in -Djava.library.path
System.setProperty(SnappyLoader.KEY_SNAPPY_USE_SYSTEMLIB, "true");