我在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。加载非原生库。不建议这样做,但它可能有效。
我就是这么做的
- 创建相同的文件夹和文件结构。
- 然后在每次启动应用程序时,让它检查32位或64位架构
- 将相应的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上不起作用,因为你不能在不影响运行时链接的情况下复制共享的目标文件。