All Downloads are FREE. Search and download functionalities are using the official Maven repository.

net.jpountz.util.Native Maven / Gradle / Ivy

There is a newer version: 1.5.1
Show newest version
/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package net.jpountz.util;

import net.jpountz.util.Native;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

/**
 * This class is copied and modified from {@link net.jpountz.util.Native},
 * so that the lz4 library can be copied to our specific temp directory.
 *
 * 

Modification: Change tempLib path from java.io.tmpdir to current working directory. */ public enum Native { ; private enum OS { // Even on Windows, the default compiler from cpptasks (gcc) uses .so as a shared lib extension WINDOWS("win32", "so"), LINUX("linux", "so"), MAC("darwin", "dylib"), SOLARIS("solaris", "so"); public final String name, libExtension; private OS(String name, String libExtension) { this.name = name; this.libExtension = libExtension; } } private static String arch() { return System.getProperty("os.arch"); } private static OS os() { String osName = System.getProperty("os.name"); if (osName.contains("Linux")) { return OS.LINUX; } else if (osName.contains("Mac")) { return OS.MAC; } else if (osName.contains("Windows")) { return OS.WINDOWS; } else if (osName.contains("Solaris") || osName.contains("SunOS")) { return OS.SOLARIS; } else { throw new UnsupportedOperationException("Unsupported operating system: " + osName); } } private static String resourceName() { OS os = os(); String packagePrefix = Native.class.getPackage().getName().replace('.', '/'); return "/" + packagePrefix + "/" + os.name + "/" + arch() + "/liblz4-java." + os.libExtension; } private static boolean loaded = false; public static synchronized boolean isLoaded() { return loaded; } public static synchronized void load() { if (loaded) { return; } // Try to load lz4-java (liblz4-java.so on Linux) from the java.library.path. try { System.loadLibrary("lz4-java"); loaded = true; return; } catch (UnsatisfiedLinkError ex) { // Doesn't exist, so proceed to loading bundled library. } String resourceName = resourceName(); InputStream is = Native.class.getResourceAsStream(resourceName); if (is == null) { throw new UnsupportedOperationException("Unsupported OS/arch, cannot find " + resourceName + ". Please try building from source."); } File tempLib; try { tempLib = File.createTempFile("liblz4-java", "." + os().libExtension, new File(".")); // copy to tempLib FileOutputStream out = new FileOutputStream(tempLib); try { byte[] buf = new byte[4096]; while (true) { int read = is.read(buf); if (read == -1) { break; } out.write(buf, 0, read); } try { out.close(); out = null; } catch (IOException e) { // ignore } System.load(tempLib.getAbsolutePath()); loaded = true; } finally { try { if (out != null) { out.close(); } } catch (IOException e) { // ignore } if (tempLib != null && tempLib.exists()) { if (!loaded) { tempLib.delete(); } else { // try to delete on exit, does it work on Windows? tempLib.deleteOnExit(); } } } } catch (IOException e) { throw new ExceptionInInitializerError("Cannot unpack liblz4-java"); } } }





© 2015 - 2025 Weber Informatics LLC | Privacy Policy