2009-12-04 4 views
11

Можно создать дубликат:
How to bundle a native library and a JNI library inside a JAR?Пакетирующие родная длл с банкой

мне нужно включить родной LIB (jnotify, но я думаю, что это does't материи) к моему банку. Я хочу сделать это с помощью NetBeans.

Я добавил Bundle-NativeCode: /lib/jnotify.dll; osname=win32 в мой manifest.mf файл и добавил jnotify.dll в projektHome\src\lib\ папку. Но, к сожалению, NetBeans переполняет manifest.mf файл.

Как я могу исправить? Могу ли я сделать это, используя только NetBeans? Правильно ли это строка 'Bundle-NativeCode: /lib/jnotify.dll; osname=win32? Я также слышал, что я должен положить хэши dlls в manifest.mf и подписать мою банку. Это правда?

ответ

6

Я не думаю, что исполняемый файл Java поддерживает Bundle-NativeCode. Я уверен, что это атрибут OSGi. Список поддерживаемых атрибутов определен в JAR File Specification.

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

+0

Спасибо за ответ. Думаю, я попробую включить его в exe. Я мог бы сделать простой битовый пакетный файл, но я предпочитаю иметь только один файл. Но я еще не нашел подходящего инструмента. Я попробовал Lunch4j, но у него нет возможности добавлять собственные библиотеки. –

+0

Я включил DLL-файл в 'user.dir', и он работал хорошо. – Jus12

3

Я столкнулся с этой проблемой при попытке подключить событие выключения Windows, когда программа работает на этой ОС. Решение, которое я в конечном итоге использовал, было по существу McDowell - добавление DLL в файл jar и извлечение его во временное место при запуске программы. Если он подходит вашей программе, вы можете оставить DLL в более постоянном месте, а затем ссылаться на нее при последующих запусках программы. Мое приложение использовалось в среде, где пользователи могли бы умышленно удалять файлы, которые им не нужны, поэтому мне пришлось извлекать DLL при каждом запуске. Однако это не привело к значительным результатам.

+2

У вас есть какой-либо фрагмент кода для этого? –

+0

См. Http: // stackoverflow.com/a/4691879/116509 – artbristol

6

Иногда я обнаружил, что проблема заключается не в Java-способе загрузки родных библиотек, а в сторонней библиотеке, которая нуждается в этом собственном коде.

Проблема заключается в том, что 3-й партии ЛИЭС будет делать в какой-то момент (обычно очень рано инициализации)

System.loadLibrary("native.dll"); 

И если native.dll не на appropiated месте он выбрасывает ошибку.

Если у вас есть доступ к источнику java-библиотеки сторонних разработчиков, это может быть легко исправить этот код, и вы можете легко извлечь свою DLL из JAR и запустить System.load перед использованием сторонней библиотеки.

Обновление Я ознакомился с источниками JNotify. Это именно то, что я сказал:

public class JNotify_win32 
{ 
    static 
    { 
     System.loadLibrary("jnotify"); /* *** */ 
     int res = nativeInit(); 
     if (res != 0) 
     { 
      throw new RuntimeException("Error initialiing native library. (#" + res + ")"); 
     } 
    } 

Take линия *** вне или окружать с примерки уловом, нагрузки с System.load() и вы сделали.

+0

Хорошая точка, но я думаю, что это не проблема в моем случае: «Чтобы использовать JNotify, вам нужно иметь собственную библиотеку (jnotify.dll или jnotify.so) в вашем java.library.path для этого вам нужно использовать prameter -Djava.library.path при запуске приложения java, например: java -cp jnotify.jar -Djava.library.path =. " –

+0

Большое спасибо. Вы на 100% прав. Я думал о создании bat и думал, что изменение местоположения dll должно быть проблемой. Когда я прочитал ваш ответ, я подумал: «Я проверил, что могу делать все с моим делом», но я проверял совершенно другую вещь. Я, должно быть, устал. –

Смежные вопросы