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

标签 java linux jna vlcj

我有一个使用 vlcj 播放视频并将 VLC 库打包在 jar 中的 Java 程序。在运行时,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 时遇到的问题是它不是我可以在运行时设置的(可以吗?)我需要做的。有谁知道解决这个问题的方法吗?

最佳答案

我自己从未找到理想的解决方案,但这是我在试用自己的 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 中 做,至少在不调用具有特权升级的 native 代码的情况下不能。

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

事实上,我只是用我自己的 native 库进行了测试,我碰巧在我自己的 vlcj 项目中使用了它,这两种方法都工作得很好。

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

理论上,如果您的目录结构正确,插件应该会自动被发现,因此您只需将 jna.library.path 指向包含 libvlc 的目录> 和 libvlccore 共享对象。在我构建的 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 插件的目录。问题是这必须为 native 进程设置,如果您从 Java 应用程序内部将其设置为系统属性,它将工作。

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

我在 Linux 上还看到,库路径似乎“嵌入”到“.so”文件中,您不能只将这些文件复制到任何地方就仍然期望它能正常工作。这就是为什么你必须使用例如LD_LIBRARY_PATHlibtool 或其他建议的解决方案之一。

这甚至没有涉及您对 VLC 及其插件在运行时可能依赖的所有其他库所做的操作 - 您是否也打算发布所有这些库?

我的建议实际上只是让用户先安装 VLC,或者让您的安装应用程序先安装 VLC,方法是使用操作系统 native 包安装命令。不理想,但它有效。

关于java - VLCJ 在运行时设置自定义库位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23889529/

相关文章:

linux - 如何用 awk 和 gsub 替换文件中的数字(分别用 NA、0101、0102 和 0202 替换 -1、0、1 和 2)?

linux - linux将文件从usb复制到桌面脚本

java - 在 64 位 JRE 中使用 opengl32.DLL?

java - 需要有关删除二叉搜索树节点的帮助

java - 创建没有输入数据的自定义生成器Hadoop InputFormat

regex - 如何通过 Linux CLI 在文件中搜索模式?

java - 使用 JNA 链接到自定义 dll

java - 如何从 JNA 中的内存/指针对象读取结构?

java - Lotus Notes 中的 Java 代理输出到客户端状态栏?

java - Android 阻止应用程序在启动时查询空数据库