VLCJ在运行时设置自定义库位置

时间:2014-05-27 12:32:01

标签: java linux jna vlcj

我有一个Java程序,它使用vlcj播放视频,并在jar中打包VLC库。在运行时,VLC库被提取到用户的家中,让我们说路径A.指示这条到vlcj的路径的正常方法是通过jna方法:

NativeLibrary.addSearchPath(RuntimeUtil.getLibVlcLibraryName(), "A");

这适用于Windows和MacOSX,但不适用于Linux,它会抛出 UnsatisfiedLinkError

经过一些试验和错误,我发现只有在linux下使用它才能使用

export LD_LIBRARY_PATH=A

在执行之前,尽管有JNA文档,但这些都不适用于JVM设置:

-Djava.library.path=A
-Djna.library.path=A
-Djna.platform.library.path=A

使用 LD_LIBRARY_PATH 的问题在于我不能在运行时设置(我可以吗?)我需要做的事情。有没有人知道如何绕过这个?

1 个答案:

答案 0 :(得分:1)

我自己从来没有找到理想的解决方案,但这是我在自己的vlcj项目试验中发现的。

如果你自己在Linux上构建VLC,你会看到这些警告:

If you ever happen to want to link against installed libraries
in a given directory, LIBDIR, you must either use libtool, and
specify the full pathname of the library, or use the `-LLIBDIR'
flag during linking and do at least one of the following:
   - add LIBDIR to the `LD_LIBRARY_PATH' environment variable
     during execution
   - add LIBDIR to the `LD_RUN_PATH' environment variable
     during linking
   - use the `-Wl,-rpath -Wl,LIBDIR' linker flag
   - have your system administrator add LIBDIR to `/etc/ld.so.conf'

它建议的所有内容都不能从的JVM中完成,至少在没有使用权限提升调用本机代码的情况下也是如此。

所以,一般来说,你留下的是:-Djna.library.path=LIBDIR应该有效;或者在代码System.setProperty("jna.library.path", "LIBDIR");中也应该有效。

事实上,我刚刚使用我自己的本机库对我自己的vlcj项目进行了测试,这两种方法都运行良好。

然而,VLC本身似乎并不那么容易,可能是因为VLC加载其插件的方式。

理论上,如果正确构建目录,则应自动发现插件,因此您只需将jna.library.path指向包含libvlclibvlccore共享对象的目录。在我的VLC版本中,目录结构如下所示:

VLCDIR
VLCDIR/libvlc.so
VLCDIR/libvlc.so.5
VLCDIR/libvlc.so.5.4.0
VLCDIR/libvlccore.so
VLCDIR/libvlccore.so.7.0.0
VLCDIR/vlc/plugins

如果仍然失败,那么理论上,您可以将VLC_PLUGIN_PATH环境变量设置为指向包含VLC插件的目录。问题是必须为本机进程设置,如果从Java应用程序内部将其设置为系统属性,它将

我真的建议您生成一个shell脚本文件,在安装应用程序时正确设置环境,或者如果您想在JVM中以编程方式执行它,您可能会有一个准备本机环境的引导应用程序然后为您的实际应用程序启动一个新的Java进程 - 但以这种方式执行操作很麻烦。

我在Linux上看到的是,库路径似乎已经在#34;到" .so"文件,你不能只是在任何地方复制这些文件,仍然期望它工作。这就是你必须使用例如LD_LIBRARY_PATHlibtool或其他提议的解决方案之一。

这甚至没有触及你在运行时对VLC及其插件可能依赖的所有其他库所做的事情 - 你是否也会发送所有这些?

我的建议只是让用户首先安装VLC,或让安装程序应用程序首先安装VLC,方法是使用操作系统本机软件包安装命令。不理想,但它有效。

相关问题