|
@@ -30,6 +30,10 @@
|
|
|
#include "config.h"
|
|
|
#endif // UNIX
|
|
|
|
|
|
+#ifdef WINDOWS
|
|
|
+#include "winutils.h"
|
|
|
+#endif
|
|
|
+
|
|
|
#include "org_apache_hadoop_io_compress_snappy_SnappyCompressor.h"
|
|
|
|
|
|
#define JINT_MAX 0x7fffffff
|
|
@@ -40,11 +44,18 @@ static jfieldID SnappyCompressor_uncompressedDirectBufLen;
|
|
|
static jfieldID SnappyCompressor_compressedDirectBuf;
|
|
|
static jfieldID SnappyCompressor_directBufferSize;
|
|
|
|
|
|
+#ifdef UNIX
|
|
|
static snappy_status (*dlsym_snappy_compress)(const char*, size_t, char*, size_t*);
|
|
|
+#endif
|
|
|
+
|
|
|
+#ifdef WINDOWS
|
|
|
+typedef snappy_status (__cdecl *__dlsym_snappy_compress)(const char*, size_t, char*, size_t*);
|
|
|
+static __dlsym_snappy_compress dlsym_snappy_compress;
|
|
|
+#endif
|
|
|
|
|
|
JNIEXPORT void JNICALL Java_org_apache_hadoop_io_compress_snappy_SnappyCompressor_initIDs
|
|
|
(JNIEnv *env, jclass clazz){
|
|
|
-
|
|
|
+#ifdef UNIX
|
|
|
// Load libsnappy.so
|
|
|
void *libsnappy = dlopen(HADOOP_SNAPPY_LIBRARY, RTLD_LAZY | RTLD_GLOBAL);
|
|
|
if (!libsnappy) {
|
|
@@ -53,10 +64,25 @@ JNIEXPORT void JNICALL Java_org_apache_hadoop_io_compress_snappy_SnappyCompresso
|
|
|
THROW(env, "java/lang/UnsatisfiedLinkError", msg);
|
|
|
return;
|
|
|
}
|
|
|
+#endif
|
|
|
+
|
|
|
+#ifdef WINDOWS
|
|
|
+ HMODULE libsnappy = LoadLibrary(HADOOP_SNAPPY_LIBRARY);
|
|
|
+ if (!libsnappy) {
|
|
|
+ THROW(env, "java/lang/UnsatisfiedLinkError", "Cannot load snappy.dll");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+#endif
|
|
|
|
|
|
// Locate the requisite symbols from libsnappy.so
|
|
|
+#ifdef UNIX
|
|
|
dlerror(); // Clear any existing error
|
|
|
LOAD_DYNAMIC_SYMBOL(dlsym_snappy_compress, env, libsnappy, "snappy_compress");
|
|
|
+#endif
|
|
|
+
|
|
|
+#ifdef WINDOWS
|
|
|
+ LOAD_DYNAMIC_SYMBOL(__dlsym_snappy_compress, dlsym_snappy_compress, env, libsnappy, "snappy_compress");
|
|
|
+#endif
|
|
|
|
|
|
SnappyCompressor_clazz = (*env)->GetStaticFieldID(env, clazz, "clazz",
|
|
|
"Ljava/lang/Class;");
|
|
@@ -74,6 +100,9 @@ JNIEXPORT void JNICALL Java_org_apache_hadoop_io_compress_snappy_SnappyCompresso
|
|
|
|
|
|
JNIEXPORT jint JNICALL Java_org_apache_hadoop_io_compress_snappy_SnappyCompressor_compressBytesDirect
|
|
|
(JNIEnv *env, jobject thisj){
|
|
|
+ const char* uncompressed_bytes;
|
|
|
+ char* compressed_bytes;
|
|
|
+ snappy_status ret;
|
|
|
// Get members of SnappyCompressor
|
|
|
jobject clazz = (*env)->GetStaticObjectField(env, thisj, SnappyCompressor_clazz);
|
|
|
jobject uncompressed_direct_buf = (*env)->GetObjectField(env, thisj, SnappyCompressor_uncompressedDirectBuf);
|
|
@@ -84,7 +113,7 @@ JNIEXPORT jint JNICALL Java_org_apache_hadoop_io_compress_snappy_SnappyCompresso
|
|
|
|
|
|
// Get the input direct buffer
|
|
|
LOCK_CLASS(env, clazz, "SnappyCompressor");
|
|
|
- const char* uncompressed_bytes = (const char*)(*env)->GetDirectBufferAddress(env, uncompressed_direct_buf);
|
|
|
+ uncompressed_bytes = (const char*)(*env)->GetDirectBufferAddress(env, uncompressed_direct_buf);
|
|
|
UNLOCK_CLASS(env, clazz, "SnappyCompressor");
|
|
|
|
|
|
if (uncompressed_bytes == 0) {
|
|
@@ -93,7 +122,7 @@ JNIEXPORT jint JNICALL Java_org_apache_hadoop_io_compress_snappy_SnappyCompresso
|
|
|
|
|
|
// Get the output direct buffer
|
|
|
LOCK_CLASS(env, clazz, "SnappyCompressor");
|
|
|
- char* compressed_bytes = (char *)(*env)->GetDirectBufferAddress(env, compressed_direct_buf);
|
|
|
+ compressed_bytes = (char *)(*env)->GetDirectBufferAddress(env, compressed_direct_buf);
|
|
|
UNLOCK_CLASS(env, clazz, "SnappyCompressor");
|
|
|
|
|
|
if (compressed_bytes == 0) {
|
|
@@ -102,8 +131,8 @@ JNIEXPORT jint JNICALL Java_org_apache_hadoop_io_compress_snappy_SnappyCompresso
|
|
|
|
|
|
/* size_t should always be 4 bytes or larger. */
|
|
|
buf_len = (size_t)compressed_direct_buf_len;
|
|
|
- snappy_status ret = dlsym_snappy_compress(uncompressed_bytes,
|
|
|
- uncompressed_direct_buf_len, compressed_bytes, &buf_len);
|
|
|
+ ret = dlsym_snappy_compress(uncompressed_bytes, uncompressed_direct_buf_len,
|
|
|
+ compressed_bytes, &buf_len);
|
|
|
if (ret != SNAPPY_OK){
|
|
|
THROW(env, "Ljava/lang/InternalError", "Could not compress data. Buffer length is too small.");
|
|
|
return 0;
|
|
@@ -128,8 +157,18 @@ Java_org_apache_hadoop_io_compress_snappy_SnappyCompressor_getLibraryName(JNIEnv
|
|
|
return (*env)->NewStringUTF(env, dl_info.dli_fname);
|
|
|
}
|
|
|
}
|
|
|
-#endif
|
|
|
+
|
|
|
return (*env)->NewStringUTF(env, HADOOP_SNAPPY_LIBRARY);
|
|
|
-}
|
|
|
+#endif
|
|
|
|
|
|
+#ifdef WINDOWS
|
|
|
+ LPWSTR filename = NULL;
|
|
|
+ GetLibraryName(dlsym_snappy_compress, &filename);
|
|
|
+ if (filename != NULL) {
|
|
|
+ return (*env)->NewString(env, filename, (jsize) wcslen(filename));
|
|
|
+ } else {
|
|
|
+ return (*env)->NewStringUTF(env, "Unavailable");
|
|
|
+ }
|
|
|
+#endif
|
|
|
+}
|
|
|
#endif //define HADOOP_SNAPPY_LIBRARY
|