لود کردن کتابخانه ی native از فایل jar

لود کردن کتابخانه ی native از فایل jar:

برای لود کردن کتابخانه های بومی (natvie) از فایل jar ، کافیه فایل های dll یا so رو در یک پکیج مثل سورس جاوا کپی کنید و از این کلاس استفاده کنید:


/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
/*
* Class NativeUtils is published under the The MIT License:
*
* Copyright (c) 2012 Adam Heinrich <adam@adamh.cz>
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*
import java.io.*;

/**
* A simple library class which helps with loading dynamic libraries stored in
* the JAR archive. These libraries usualy contain implementation of some
* methods in native code (using JNI - Java Native Interface).
*
* @see
* http://adamheinrich.com/blog/2012/how-to-load-native-jni-library-from-jar
* @see https://github.com/adamheinrich/native-utils
*
*/
public class NativeUtils {

	/**
* Private constructor - this class will never be instanced
*/
	private NativeUtils() {}

	/**
* Loads library from current JAR archive
*
* The file from JAR is copied into system temporary directory and then
* loaded. The temporary file is deleted after exiting. Method uses String
* as filename because the pathname is "abstract", not system-dependent.
*
* @param path The path of file inside JAR as absolute path (beginning and
* ends with '/')
* @param libname name of lib to load from jar without extension
* @throws IOException If temporary file creation or read/write operation
* fails
* @throws IllegalArgumentException If source file (param path) does not
* exist
* @throws IllegalArgumentException If the path is not absolute or if the
* filename is shorter than three characters (restriction of {
* @see File#createTempFile(java.lang.String, java.lang.String)}).
*/
	public static void loadLibraryFromJar(String path, String libName) throws IOException {

		if (!path.startsWith("/")) {
			throw new IllegalArgumentException("The path has to be absolute (start with '/').");
		} else if (!path.endsWith("/")) {
			throw new IllegalArgumentException("The path has to be end with '/'.");
		}

		//Host platform dependent library name.extension
		path += System.mapLibraryName(libName);
		System.out.println(path);

		// Obtain filename from path
		String[] parts = path.split("/");
		String filename = (parts.length & gt; 1) ? parts[parts.length - 1] : null;

		// Split filename to prexif and suffix (extension)
		String prefix = "";
		String suffix = null;
		if (filename != null) {
			parts = filename.split("\\.", 2);
			prefix = parts[0];
			suffix = (parts.length & gt; 1) ? "." + parts[parts.length - 1] : null; // Thanks, davs! 🙂
		}

		// Check if the filename is okay
		if (filename == null || prefix.length() & lt; 3) {
			throw new IllegalArgumentException("The filename has to be at least 3 characters long.");
		}

		// Prepare temporary file
		File temp = File.createTempFile(prefix, suffix);
		temp.deleteOnExit();

		if (!temp.exists()) {
			throw new FileNotFoundException("File " + temp.getAbsolutePath() + " does not exist.");
		}

		// Prepare buffer for data copying
		byte[] buffer = new byte[1024];
		int readBytes;

		// Open and check input stream
		InputStream is = NativeUtils.class.getResourceAsStream(path);
		if (is == null) {
			throw new FileNotFoundException("File " + path + " was not found inside JAR.");
		}

		// Open output stream and copy data between source file in JAR and the temporary file
		OutputStream os = new FileOutputStream(temp);
		try {
			while ((readBytes = is.read(buffer)) != -1) {
				os.write(buffer, 0, readBytes);
			}
		} finally {
			// If read/write fails, close streams safely before throwing an exception
			os.close();
			is.close();
		}

		// Finally, load the library
		System.load(temp.getAbsolutePath());
	}
}

https://github.com/RayanFar/native-utils

لود کردن کتابخانه ی native از فایل jar