【问题标题】:VLCJ setting custom library location at runtimeVLCJ 在运行时设置自定义库位置
【发布时间】:2014-05-27 12:32:01
【问题描述】:

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

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

这适用于 Windows 和 MacOSX,但不适用于引发 UnsatisfiedLinkError 的 Linux。

经过反复试验,我发现只有通过使用才能让它在 linux 下工作

export LD_LIBRARY_PATH=A

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

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

我使用 LD_LIBRARY_PATH 的问题是我不能在运行时设置(可以吗?),我需要这样做。有谁知道解决这个问题的方法吗?

【问题讨论】:

    标签: java linux jna vlcj


    【解决方案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'
    

    它建议的这些事情你都不能在 in 你的 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 上还看到,库路径似乎“嵌入”到“.so”文件中,您不能只是将这些文件复制到任何地方并仍然期望它能够工作。这就是为什么你必须使用例如LD_LIBRARY_PATHlibtool 或其他建议的解决方案之一。

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

    我的建议实际上只是让用户先安装 VLC,或者让您的安装程序应用程序先安装 VLC,方法是使用操作系统本机软件包安装命令。不理想,但可以。

    【讨论】:

    • 奇怪的是,问题仍然存在,尽管我尊重层次结构。似乎 jna.library.path 属性没有“传递”以加载超出 libvlc.so (请记住,在我的问题中, LD_LIBRARY_PATH 确实 工作,因此归结为库的级联方式)。使用已安装版本的问题是您无法保证与您发货的 vlcj 的兼容性。
    • JNA 不加载 VLC 的插件;您需要重新配置 VLC,以便它改变 用来加载其插件的路径。
    • 这里有一个类似的问题:forum.videolan.org/viewtopic.php?f=32&t=119693#p404962 - 建议将插件放在包含 libvlccore 共享库的目录下名为“plugins”的子目录中。
    猜你喜欢
    • 2015-07-11
    • 2014-03-22
    • 1970-01-01
    • 2016-02-11
    • 2012-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多