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

com.luciad.imageio.webp.NativeLoader Maven / Gradle / Ivy

/*--------------------------------------------------------------------------
 *  Copyright 2007 Taro L. Saito
 *
 *  Licensed 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.
 *--------------------------------------------------------------------------*/
//--------------------------------------
// SQLite JDBC Project
//
// SQLite.java
// Since: 2007/05/10
//
// $URL$
// $Author$
//--------------------------------------
package com.luciad.imageio.webp;

import com.luciad.imageio.webp.util.OSInfo;
import com.luciad.imageio.webp.util.StringUtils;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FilenameFilter;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.LinkedList;
import java.util.List;
import java.util.Properties;
import java.util.UUID;

/**
 * The library files are automatically extracted from this project's package
 * (JAR).
 * 

* usage: call {@link #initialize()} before using the library. * * @author leo */ public class NativeLoader { private static boolean extracted = false; /** * Loads native library. * * @return True if native library is successfully loaded; false * otherwise. */ public static synchronized boolean initialize() throws Exception { // only cleanup before the first extract if (!extracted) { cleanup(); } loadNativeLibrary(); return extracted; } private static File getTempDir() { return new File(System.getProperty("com.luciad.imageio.webp.tmpdir", System.getProperty("java.io.tmpdir"))); } /** * Deleted old native libraries e.g. on Windows the DLL file is not removed * on VM-Exit (bug #80) */ static void cleanup() { String tempFolder = getTempDir().getAbsolutePath(); File dir = new File(tempFolder); File[] nativeLibFiles = dir.listFiles(new FilenameFilter() { private final String searchPattern = "webp-imageio-" + getVersion(); public boolean accept(File dir, String name) { return name.startsWith(searchPattern) && !name.endsWith(".lck"); } }); if (nativeLibFiles != null) { for (File nativeLibFile : nativeLibFiles) { File lckFile = new File(nativeLibFile.getAbsolutePath() + ".lck"); if (!lckFile.exists()) { try { nativeLibFile.delete(); } catch (SecurityException e) { System.err.println("Failed to delete old native lib" + e.getMessage()); } } } } } private static boolean contentsEquals(InputStream in1, InputStream in2) throws IOException { if (!(in1 instanceof BufferedInputStream)) { in1 = new BufferedInputStream(in1); } if (!(in2 instanceof BufferedInputStream)) { in2 = new BufferedInputStream(in2); } int ch = in1.read(); while (ch != -1) { int ch2 = in2.read(); if (ch != ch2) { return false; } ch = in1.read(); } int ch2 = in2.read(); return ch2 == -1; } /** * Extracts and loads the specified library file to the target folder * * @param libFolderForCurrentOS Library path. * @param libraryFileName Library name. * @param targetFolder Target folder. * @return */ private static boolean extractAndLoadLibraryFile(String libFolderForCurrentOS, String libraryFileName, String targetFolder) { String nativeLibraryFilePath = libFolderForCurrentOS + "/" + libraryFileName; // Include architecture name in temporary filename in order to avoid conflicts // when multiple JVMs with different architectures running at the same time String uuid = UUID.randomUUID().toString(); String extractedLibFileName = String.format("webp-imageio-%s-%s-%s", getVersion(), uuid, libraryFileName); String extractedLckFileName = extractedLibFileName + ".lck"; File extractedLibFile = new File(targetFolder, extractedLibFileName); File extractedLckFile = new File(targetFolder, extractedLckFileName); try { // Extract a native library file into the target directory InputStream reader = NativeLoader.class.getResourceAsStream(nativeLibraryFilePath); if (!extractedLckFile.exists()) { new FileOutputStream(extractedLckFile).close(); } FileOutputStream writer = new FileOutputStream(extractedLibFile); try { byte[] buffer = new byte[8192]; int bytesRead = 0; while ((bytesRead = reader.read(buffer)) != -1) { writer.write(buffer, 0, bytesRead); } } finally { // Delete the extracted lib file on JVM exit. extractedLibFile.deleteOnExit(); extractedLckFile.deleteOnExit(); if (writer != null) { writer.close(); } if (reader != null) { reader.close(); } } // Set executable (x) flag to enable Java to load the native library extractedLibFile.setReadable(true); extractedLibFile.setWritable(true, true); extractedLibFile.setExecutable(true); // Check whether the contents are properly copied from the resource folder { InputStream nativeIn = NativeLoader.class.getResourceAsStream(nativeLibraryFilePath); InputStream extractedLibIn = new FileInputStream(extractedLibFile); try { if (!contentsEquals(nativeIn, extractedLibIn)) { throw new RuntimeException(String.format("Failed to write a native library file at %s", extractedLibFile)); } } finally { if (nativeIn != null) { nativeIn.close(); } if (extractedLibIn != null) { extractedLibIn.close(); } } } return loadNativeLibrary(targetFolder, extractedLibFileName); } catch (IOException e) { System.err.println(e.getMessage()); return false; } } /** * Loads native library using the given path and name of the library. * * @param path Path of the native library. * @param name Name of the native library. * @return True for successfully loading; false otherwise. */ private static boolean loadNativeLibrary(String path, String name) { File libPath = new File(path, name); if (libPath.exists()) { try { System.load(new File(path, name).getAbsolutePath()); return true; } catch (UnsatisfiedLinkError e) { System.err.println("Failed to load native library:" + name + ". osinfo: " + OSInfo.getNativeLibFolderPathForCurrentOS()); System.err.println(e); return false; } } else { return false; } } /** * Loads native library using given path and name of the library. * * @throws */ private static void loadNativeLibrary() throws Exception { if (extracted) { return; } List triedPaths = new LinkedList<>(); String nativeLibraryName = System.mapLibraryName("webp-imageio"); // Load the os-dependent library from the jar file String nativeLibraryPath = String.format("/native/%s", OSInfo.getNativeLibFolderPathForCurrentOS()); boolean hasNativeLib = hasResource(nativeLibraryPath + "/" + nativeLibraryName); if (hasNativeLib) { // temporary library folder String tempFolder = getTempDir().getAbsolutePath(); // Try extracting the library from jar if (extractAndLoadLibraryFile(nativeLibraryPath, nativeLibraryName, tempFolder)) { extracted = true; return; } else { triedPaths.add(nativeLibraryPath); } } // As a last resort try from java.library.path String javaLibraryPath = System.getProperty("java.library.path", ""); for (String ldPath : javaLibraryPath.split(File.pathSeparator)) { if (ldPath.isEmpty()) { continue; } if (loadNativeLibrary(ldPath, nativeLibraryName)) { extracted = true; return; } else { triedPaths.add(ldPath); } } extracted = false; throw new Exception(String.format("No native library found for os.name=%s, os.arch=%s, paths=[%s]", OSInfo.getOSName(), OSInfo.getArchName(), StringUtils.join(triedPaths, File.pathSeparator))); } private static boolean hasResource(String path) { return NativeLoader.class.getResource(path) != null; } @SuppressWarnings("unused") private static void getNativeLibraryFolderForTheCurrentOS() { String osName = OSInfo.getOSName(); String archName = OSInfo.getArchName(); } /** * @return The major version of the library. */ public static int getMajorVersion() { String[] c = getVersion().split("\\."); return (c.length > 0) ? Integer.parseInt(c[0]) : 1; } /** * @return The minor version of the library. */ public static int getMinorVersion() { String[] c = getVersion().split("\\."); return (c.length > 1) ? Integer.parseInt(c[1]) : 0; } /** * @return The version of the library. */ public static String getVersion() { URL versionFile = NativeLoader.class.getResource("/META-INF/maven/org.sejda.imageio/webp-imageio/pom.properties"); if (versionFile == null) { versionFile = NativeLoader.class.getResource("/META-INF/maven/org.sejda.imageio/webp-imageio/VERSION"); } String version = "unknown"; try { if (versionFile != null) { Properties versionData = new Properties(); versionData.load(versionFile.openStream()); version = versionData.getProperty("version", version); version = version.trim().replaceAll("[^0-9\\.]", ""); } } catch (IOException e) { System.err.println(e); } return version; } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy