VLCJ从不同的文件夹加载32位和64位库

时间:2015-08-08 18:54:15

标签: java vlc jna libvlc vlcj

我在我的java程序中使用vlcj进行音频和视频支持。 我将libvlccore.dll ...和插件文件夹集成到我项目中的“VLC”文件夹中,因此如果用户没有安装vlc,它甚至会运行。

但我必须将它们分成32个(带有vlc 32位dll文件)和64位(带64位dll文件)版本,它必须与java架构相匹配... 如果我能将32位和64位.dll文件包含在一个版本中,检查使用哪种JRE架构并加载正确的dll文件,那将是很好的。我的问题,插件文件夹大约100 MB,但似乎4 dll文件必须与插件文件夹在同一个文件夹中... 我可以创建一个“32”和一个“64”文件夹,包括dll文件和插件文件夹,但这会导致插件文件夹的不必要副本...

    String testpath = new File("").getAbsolutePath().toString();
    testpath = testpath.replace(".", "");
    testpath = testpath.replace("\\", "//");
    testpath = testpath+"//VLC";
    NativeLibrary.addSearchPath(RuntimeUtil.getLibVlcLibraryName(), testpath+(System.getProperty("sun.arch.data.model").equals("64")?"//64":"//32")); // Get the right dll files when the JRE is 32 / 64 bit...
    NativeLibrary.addSearchPath(RuntimeUtil.getPluginsDirectoryName(), testpath); // This doesn´t seem to have any effect.         
    Native.loadLibrary(RuntimeUtil.getLibVlcLibraryName(), LibVlc.class);

我收到错误:

main libvlc error: No plugins found! Check your VLC installation.

有没有办法加载dll文件和插件而不将它们放在同一个文件夹中?

我的文件夹如下:

"\\VLC"
.."\\plugins"
.."\\32"
...."libvlccore.dll"
...."axvlc.dll"
...."libvlc.dll"
...."npvlc.dll"
.."\\64"
...."libvlccore.dll"
...."axvlc.dll"
...."libvlc.dll"
...."npvlc.dll"

3 个答案:

答案 0 :(得分:0)

您可以将dll重命名为libvlc..32.dll和libvlc..64.dll。在代码检查环境中,如果是32位或64位,则以编程方式检查环境,然后使用System.loadLibrary或System.load而不是NativeLibarary相应地加载您的dll。不推荐它但它可能有效。

答案 1 :(得分:0)

这就是我这样做的方式

  1. 制作与您相同的文件夹和文件结构。
  2. 然后在应用程序的每次启动时,检查32位或64位架构
  3. 将相应的dll文件复制到plugins文件夹。但在此之前,请先检查dll文件是否不存在。如果dll文件存在于插件文件夹中,但它们不是正确的文件,则替换它们。
  4. 我假设每次打开应用程序时都不会将dll文件实际复制到插件文件夹,因为只有在第一次启动应用程序或用户将JRE从32位更改为64位,反之亦然。所以在启动期间大部分时间都没有相当大的延迟。

答案 2 :(得分:0)

您需要提供32位和64位版本的LibVLC,LibVLCCore和所有插件。

所以有两个目录,称之为你想要的," 32"和" 64"将作为一个例子。

将32位VLC的整个安装(包括32位插件目录)和维护整个目录结构放入" 32"。

将64位VLC的整个安装(包括64位插件目录)和维护整个目录结构放入" 64"。

运行应用程序时,在运行时确定所需的架构,然后将JNA / vlcj指向适当的架构。

有很多方法可以做到这一点,最简单的是:

NativeLibrary.addSearchPath(RuntimeUtil.getLibVlcLibraryName(), "your-app-dir/32");

或者

NativeLibrary.addSearchPath(RuntimeUtil.getLibVlcLibraryName(), "your-app-dir/64");

我认为它不应该比这更复杂。

只要保持相同的目录结构,LibVLC就应该在自己的目录下自动找到插件。

如果仍有问题,可以尝试将系统环境变量VLC_PLUGIN_PATH设置为指向正确的插件目录 - 但这不是必需的。

请记住,您必须将JVM的CPU架构与VLC安装相匹配。

此外,这可能无法在Linux上运行,因为您无法在不影响运行时链接的情况下复制共享对象文件。