我在我的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"
答案 0 :(得分:0)
您可以将dll重命名为libvlc..32.dll和libvlc..64.dll。在代码检查环境中,如果是32位或64位,则以编程方式检查环境,然后使用System.loadLibrary或System.load而不是NativeLibarary相应地加载您的dll。不推荐它但它可能有效。
答案 1 :(得分:0)
这就是我这样做的方式
我假设每次打开应用程序时都不会将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上运行,因为您无法在不影响运行时链接的情况下复制共享对象文件。