Запретить загрузку библиотеки Java более одного раза - PullRequest
13 голосов
/ 15 июля 2009

У меня есть несколько классов, которые используют одну и ту же библиотеку JNI, которая называется "jni". В каждом из этих классов у меня есть вызов System.loadLibrary () в статическом инициализаторе класса:

Class class1 {
    static{
        System.loadLibrary("jni");
    }
    ...
}

Class class2 {
    static{
        System.loadLibrary("jni");
    }
    ...
}

Единственная проблема в том, что я хочу, чтобы System.loadLibrary () вызывался только один раз, поскольку это может занять некоторое время. Существует ли простой и понятный способ предотвратить множественные загрузки одной и той же библиотеки?

Ответы [ 4 ]

32 голосов
/ 15 июля 2009

Если библиотека уже загружена, любые последующие вызовы для загрузки той же библиотеки будут игнорироваться.

System.loadLibrary:

Загружает системную библиотеку, указанную аргумент libname. Манера в который имя библиотеки отображается на актуальная системная библиотека является системной зависимый.

Вызов System.loadLibrary (имя) эффективно эквивалентно вызову

 Runtime.getRuntime().loadLibrary(name)

Runtime.loadLibrary

Загружает динамическую библиотеку с указанное имя библиотеки. Файл содержащий нативный код загружается из локальная файловая система с места где файлы библиотеки традиционно получен. Подробности этого процесса зависят от реализации. отображение от имени библиотеки к конкретное имя файла делается в системно-ориентированный способ.

Во-первых, если есть менеджер безопасности, его метод checkLink вызывается с имя библиотеки в качестве аргумента. Это может привести к исключению безопасности.

Метод System.loadLibrary (String) это обычный и удобный средство вызова этого метода. Если нативные методы должны быть использованы в реализация класса, стандарт Стратегия заключается в том, чтобы поместить нативный код в файл библиотеки (назовите его LibFile) и затем поставить статический инициализатор:

 static { System.loadLibrary("LibFile"); }

в объявлении класса. Когда класс загружается и инициализируется, необходимая реализация нативного кода для нативных методов тогда будет также загружен.

Если этот метод вызывается более чем один раз с тем же именем библиотеки, второй и последующие вызовы игнорироваться.

2 голосов
/ 15 июля 2009

Из JavaDocs -

Если этот метод вызывается более одного раза с тем же именем библиотеки, второй и последующие вызовы игнорируются.

0 голосов
/ 15 июля 2009

Создайте одноэлементный класс, который загружает «jni» только во время его первого создания, и вызывайте этот синглтон в class1 и class2 вместо System.loadLibrary («jni»)

0 голосов
/ 15 июля 2009

Я почти уверен, что любые последующие вызовы для загрузки уже загруженной библиотеки не имеют никакого эффекта [цитата нужна].

Это было проверено в исходном коде класса ClassLoader, но я все еще пытаюсь найти хороший источник для этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...