1 package com.google.ortools;
3 import com.sun.jna.Platform;
4 import java.io.IOException;
6 import java.net.URISyntaxException;
8 import java.nio.file.FileSystem;
9 import java.nio.file.FileSystems;
10 import java.nio.file.FileVisitResult;
11 import java.nio.file.Files;
12 import java.nio.file.Path;
13 import java.nio.file.SimpleFileVisitor;
14 import java.nio.file.attribute.BasicFileAttributes;
15 import java.util.Collections;
16 import java.util.Objects;
21 private static URI getNativeResourceURI()
throws IOException {
22 ClassLoader loader =
Loader.class.getClassLoader();
23 String resource = Platform.RESOURCE_PREFIX +
"/";
24 URL resourceURL = loader.getResource(resource);
25 Objects.requireNonNull(resourceURL,
26 String.format(
"Resource %s was not found in ClassLoader %s", resource, loader));
30 resourceURI = resourceURL.toURI();
31 }
catch (URISyntaxException e) {
32 throw new IOException(e);
38 private interface PathConsumer<T
extends IOException> {
39 void accept(Path path)
throws T;
47 private static Path unpackNativeResources(URI resourceURI)
throws IOException {
49 tempPath = Files.createTempDirectory(
"ortools-java");
50 tempPath.toFile().deleteOnExit();
52 PathConsumer<?> visitor;
53 visitor = (Path sourcePath) -> Files.walkFileTree(sourcePath,
new SimpleFileVisitor<Path>() {
55 public FileVisitResult visitFile(Path file, BasicFileAttributes attrs)
throws IOException {
56 Path newPath = tempPath.resolve(sourcePath.getParent().relativize(file).toString());
57 Files.copy(file, newPath);
58 newPath.toFile().deleteOnExit();
59 return FileVisitResult.CONTINUE;
63 public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs)
65 Path newPath = tempPath.resolve(sourcePath.getParent().relativize(dir).toString());
66 Files.copy(dir, newPath);
67 newPath.toFile().deleteOnExit();
68 return FileVisitResult.CONTINUE;
72 FileSystem fs = FileSystems.newFileSystem(resourceURI, Collections.emptyMap());
73 Path p = fs.provider().getPath(resourceURI);
79 private static boolean loaded =
false;
83 URI resourceURI = getNativeResourceURI();
84 Path tempPath = unpackNativeResources(resourceURI);
86 System.load(tempPath.resolve(Platform.RESOURCE_PREFIX)
87 .resolve(System.mapLibraryName(
"jniortools"))
90 }
catch (IOException e) {
91 throw new RuntimeException(e);