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



我在java程序中使用vlcj进行音频和视频支持。我集成了libvlccore.dll…并将插件文件夹放入我的项目中的"VLC"文件夹中,因此即使用户没有安装VLC,它也可以运行。

但我必须将它们分为32(与vlc 32位dll文件)和64位(与64位dll文件)版本,必须与java架构匹配…如果我能将32位和64位的.dll文件包含到一个版本中,该版本可以检查使用了哪个JRE架构并加载正确的dll文件,那就太好了。我的问题是,插件文件夹约100 mb大,但似乎4个dll文件必须与插件文件夹在同一文件夹中…我可以创建一个"32"one_answers"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"

可以将dll重命名为libvlc. 32.dll和libvlc. 64.dll。在代码检查环境中,如果是32位或64位,则通过使用System相应地加载dll。loadLibrary或System。加载非原生库。不建议这样做,但它可能有效。

我就是这么做的

  1. 创建相同的文件夹和文件结构。
  2. 然后在每次启动应用程序时,让它检查32位或64位架构
  3. 将相应的dll文件复制到plugins文件夹。但在此之前,请先检查dll文件是否不存在。如果dll文件存在于插件文件夹中,但它们不是正确的文件,则替换它们。

我假设dll文件的实际复制到插件文件夹并不发生每次应用程序打开,因为它应该只在应用程序第一次启动或当用户将JRE从32位更改为64位或反之亦然。因此,在大多数情况下,在启动过程中没有相当大的延迟。

您需要发布32位和64位版本的LibVLC, libvlcocore和所有插件。

所以有两个目录,你想叫什么就叫什么,例如"32"one_answers"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上不起作用,因为你不能在不影响运行时链接的情况下复制共享的目标文件。

相关内容

  • 没有找到相关文章

最新更新