Упаковка родной библиотеки в банку - PullRequest
2 голосов
/ 23 октября 2019

Я написал собственный интерфейс Java (JNI), который я хотел бы упаковать в JAR и импортировать как зависимость в проект Gradle / Java 8 (Gradle Wrapper 4.6). Единственный способ использовать мои классы JNI - это скопировать нативную библиотеку в каталог / tmp основного проекта, прежде чем инициализировать любой модуль из JAR, который опирается на эту нативную библиотеку. Я использую конструктор класса, чтобы передать абсолютный путь к файлу tmp, чтобы он мог быть загружен в JNI.

Мои вопросы:

  • Копирует нативныйбиблиотеку из jar-файла и запись ее в каталог / tmp основного приложения. Существуют ли другие возможные варианты использования инструмента сборки, такого как Gradle?

  • Есть ли потенциальные известные побочные эффекты ссылки на нативную библиотеку таким образом?

Ниже показано, как я копирую библиотеку в основном приложении:

static {
        String libName = System.mapLibraryName("OnnxImp");
        File tmpNativeLib = null;

        try (InputStream stream = System.class.getResourceAsStream("/" + libName)) {
            if (stream == null) {
                throw new IllegalStateException("failed to find library " + libName);
            }

            tmpNativeLib = File.createTempFile(libName, null);
            try (FileOutputStream tempOutputStream = new FileOutputStream(tmpNativeLib)) {
                IOUtils.copy(stream, tempOutputStream);
            }

        } catch (Exception e) {
            tmpNativeLib = null;
        } finally {
            onnxAPI = new OnnxAPI(tmpNativeLib.getAbsolutePath());
            tmpNativeLib.delete();
        }
    }

Ниже показано, как я загружаю нативную библиотеку в JNI:

public class JNIClass {

    public JNIClass() {
        System.loadLibrary("OnnxImp");
    }

    public JNIClass(String tmpNativeLibPath) {
        if (tmpNativeLibPath != null) {
            System.load(tmpNativeLibPath);
        } else {
            throw new IllegalArgumentException("No library path passed into JNIClass");
        }
    }

...

}
...