Я написал собственный интерфейс 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");
}
}
...
}