我自己从来没有找到一个理想的解决方案,但这是我在尝试自己的 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'
它建议的这些事情你都不能在 in 你的 JVM 中做,至少在不调用具有特权提升的本机代码的情况下是不能做的。
所以,总的来说,你剩下的是:-Djna.library.path=LIBDIR 应该可以工作;或者在代码System.setProperty("jna.library.path", "LIBDIR"); 中也应该可以工作。
事实上,我只是用我自己的本地库进行了测试,我碰巧在我自己的 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 插件的目录。问题是这必须为本地进程设置,如果您从 Java 应用程序内部将其设置为系统属性,它将不起作用。
我真的只能建议您在安装应用程序时生成一个正确设置环境的 shell 脚本文件,或者如果您想在 JVM 内以编程方式执行此操作,您可能需要一个引导应用程序来准备本机环境然后为您的实际应用程序启动一个新的 Java 进程 - 但这样做很麻烦。
我在 Linux 上还看到,库路径似乎“嵌入”到“.so”文件中,您不能只是将这些文件复制到任何地方并仍然期望它能够工作。这就是为什么你必须使用例如LD_LIBRARY_PATH 或 libtool 或其他建议的解决方案之一。
这甚至没有涉及您对 VLC 及其插件在运行时可能依赖的所有其他库所做的事情 - 您是否也要发布所有这些库?
我的建议实际上只是让用户先安装 VLC,或者让您的安装程序应用程序先安装 VLC,方法是使用操作系统本机软件包安装命令。不理想,但可以。