【问题标题】:Configuring libmediainfo to work with Java project without installation across all platforms (OSes)配置 libmediainfo 以使用 Java 项目,无需跨所有平台 (OS) 安装
【发布时间】:2013-04-05 05:06:57
【问题描述】:

我正在使用 mediainfo (http://mediainfo.sourceforge.net/en) 使用 Java 代码从音频和视频文件中提取信息。

我的 java 项目在所有平台(osx、win 和 linux)上运行。到目前为止,我只在过程简单的 osx 上测试了 mediainfo:只需将 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 中查找

但是通过从http://mediainfo.sourceforge.net/en/Download/Ubuntu安装合适的 libmediainfo0 & libzen0 ".deb 解决了这个问题

不过,我的解决方案需要是可移植的,也就是说,我希望所有必要的资源都包含在 java 项目包中,而无需任何进一步的安装。 我还需要知道是否可以更改 mediainfo 以在我的 java 包中查找资源而不是系统位置。

供您参考,我正在使用 Java Native Access (jna) 与库进行交互。还使用网站建议的 MediaInfo.java 和 MediaInfoLibrary.java 类。 如果您需要其他详细信息,请告诉我。

任何智慧都会受到高度赞赏 谢谢!!

【问题讨论】:

  • 最新版本的 JNA (3.5.2) 将自动解压原生库 bundled as resources(无论是基于文件还是基于 jar)。
  • 谢谢。你能详细说明一下吗?
  • 如果您将 linux/amd64 的共享库作为 /linux-x86-64/libmylibrary.so 包含在您的一个 jar 文件中,JNA 将在您调用 Native.loadLibrary("my library") 时自动提取并加载它.旧版本的 JNA 要求您在 LD_LIBRARY_PATH(变量)或 jna.library.path(系统属性)上提供该库。
  • 就是这样!它终于奏效了(@至少现在在 linux 上)我在“linux-i386”dir sweeeeet 下的 jar 文件中添加了资源!您能否将您的评论添加为答案,以便我可以接受 thx 一百万

标签: java linux macos jna mediainfo


【解决方案1】:

最新版本的 JNA (3.5.2) 将自动解压原生库 bundled as resources(无论是基于文件还是基于 jar)。

如果您将 linux/amd64 的共享库作为 /linux-x86-64/libmylibrary.so 包含在您的一个 jar 文件中,JNA 将在您调用 Native.loadLibrary("my library") 时将其提取并自动加载。旧版本的 JNA 要求您在 LD_LIBRARY_PATH(变量)或 jna.library.path(系统属性)上提供该库。

【讨论】:

  • 另外,对于 ubuntu 12.04 i386,资源(libmediainfo.so 和 libzen.so)必须放在名为 linux-i386 的目录中。我怎么知道其他文件夹在其他平台上应该有什么名字??
  • Native.getNativeLibraryResourcePrefix()(在后续版本中将是 Platform.RESOURCE_PREFIX 的别名)。
猜你喜欢
  • 1970-01-01
  • 2011-04-18
  • 1970-01-01
  • 2013-07-02
  • 1970-01-01
  • 1970-01-01
  • 2012-01-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多