2013-04-12 3 views
0

Я использую mediainfo (http://mediainfo.sourceforge.net/en) для извлечения информации из аудио и видеофайлов с использованием Java-кода.Настройка libmediainfo для работы с Java-проектом без установки на всех платформах (ОС)

Мой проект java работает на всех платформах (osx, win & linux). До сих пор я только тестировал mediainfo по osx, где процедура проста: просто поместите libmediainfo.dylib в целевую папку и получите доступ к ней с помощью родной библиотеки, и вам хорошо идти. И решение работает безупречно ...

Теперь я хочу расширить эту функциональность до других ОС, начиная с Linux. Однако это оказалось более сложной задачей, чем я думал. Сначала я продолжал получать это:

"java.lang.UnsatisfiedLinkError: Unable to load library 'mediainfo': libmediainfo.so: cannot open shared object file: No such file or directory" 

и это, как ожидается, как он смотрел в/USR/Lib

, но это была решена путем установки подходящего libmediainfo0 & libzen0».deb из http://mediainfo.sourceforge.net/en/Download/Ubuntu

Тем не менее, мое решение должно быть портативным, то есть я хочу, чтобы все необходимые ресурсы были включены в пакет Java-пакета без каких-либо дополнительных установок. Мне также нужно знать, можно ли изменить mediainfo для поиска ресурса ces в моем java-пакете вместо системного расположения.

Для вашей справки я использую Java Native Access (jna) для взаимодействия с библиотекой. Также используйте классы MediaInfo.java & MediaInfoLibrary.java, которые предлагает веб-сайт. Сообщите мне, если вам нужны другие детали.

любая мудрость высоко ценится спасибо !!

+1

Последняя версия JNA (3.5.2) автоматически распакует собственные библиотеки [в комплекте как ресурсы] (http://twall.github.io/jna/3.5.2/javadoc/com/sun/jna/NativeLibrary. html) (будь то файловая или jar-based). – technomage

+0

Спасибо за это. Не могли бы вы подробнее рассказать об этом? – static0886

+1

Если вы включили вашу общую библиотеку для linux/amd64 в качестве /linux-x86-64/libmylibrary.so в один из ваших файлов jar, JNA будет извлекать ее и загружать автоматически, когда вы вызываете 'Native.loadLibrary (« моя библиотека ») '. Старые версии JNA требуют, чтобы библиотека была доступна на 'LD_LIBRARY_PATH' (envariable) или' jna.library.path' (системное свойство). – technomage

ответ

2

Последняя версия JNA (3.5.2) автоматически распакует исходные библиотеки bundled as resources (будь то файловые или jar-based).

Если вы включили в общий файл библиотеки linux/amd64 /linux-x86-64/libmylibrary.so в одном из ваших файлов jar, JNA будет извлекать его и загружать автоматически, когда вы вызываете Native.loadLibrary("my library"). Старые версии JNA требуют, чтобы библиотека была доступна на LD_LIBRARY_PATH (envariable) или jna.library.path (системное свойство).

+0

как раз в качестве дополнительного, для ubuntu 12.04 i386 ресурсы (libmediainfo.so и libzen.so) должны были быть помещены в каталог с именем linux-i386 , Как я могу определить, какие имена должны иметь другие папки на других платформах? – static0886

+1

'Native.getNativeLibraryResourcePrefix()' (который будет псевдонимом 'Platform.RESOURCE_PREFIX' в последующих выпусках). – technomage