为了账号安全,请及时绑定邮箱和手机立即绑定

VLCJ - 在 64 位 Linux 上捆绑本机 VLC 库

VLCJ - 在 64 位 Linux 上捆绑本机 VLC 库

一只斗牛犬 2021-06-21 21:01:31
背景:我正在用 Java 编写一个跨平台的音频播放器。在 Linux 上,我以 appimage ( https://appimage.org/ )的形式分发它。我使用 VLC/VLCJ 作为解码引擎。appimages 的基本准则是在 appimage 中包含所有必需的库,这些库不能合理地预期默认包含在发行版中。这样做是为了让用户不需要解决依赖项和/或与库和程序之间的版本差异作斗争。他们还建议针对少数 Linux 发行版的先前版本进行测试,以确认一切正常。Ubuntu 16.04 和 Fedora 27.16 默认不安装 libvlc。我确信这对于许多其他发行版来说很常见。因此,我想在我的 appimage 中打包 libvlc 库。问题:在 Linux 上,我无法让 vlcj 识别/查找libvlc.so,libvlccore.so除非它们是通过发行版安装的。设置:我通过我的发行版安装了 VLC,我的程序运行并正常工作。我将libvlc.so、libvlccore.so和其他关联库从我的发行版中的默认位置复制到我的项目中的文件夹中。我将该文件夹添加到 Native Library Search 路径(见下面的代码)。我卸载了 VLC。我试图运行我的程序。它因下面粘贴的错误而崩溃。注意:我在 Windows 上使用了相同的基本方法,它在那里完美运行。简化代码:String nativeVLCLibPath = Hypnos.getRootDirectory().resolve( "lib/nix/vlc/" ).toAbsolutePath().toString();System.out.println ( "Trying to look for libraries in: " + nativeVLCLibPath );NativeLibrary.addSearchPath( RuntimeUtil.getLibVlcLibraryName(), nativeVLCLibPath );
查看完整描述

3 回答

?
喵喔喔

TA贡献1735条经验 获得超5个赞

我敢打赌本机 lib 的发行版版本是使用硬编码路径构建的,可能是绝对路径。不幸的是,编写库需要这些的情况并不少见——它们通常作为标志传递到 ./configure 脚本或 makefile 或构建时的任何内容中。唯一的解决方法是自己构建库,或在发行版库的预期系统目录中,在目标系统上安装并行符号链接/硬链接,以指向您的库。或者在 chroot 下执行,但这是一个极端的选择,对您来说可能不切实际。


查看完整回答
反对 回复 2021-06-30
?
动漫人物

TA贡献1815条经验 获得超10个赞

我可以看到使用 appimage 的吸引力,但我所做的是创建一个分发包(.deb 或其他),其中包含我的应用程序和 vlcj,并依赖于 LibVLC(和 jdk)。


查看完整回答
反对 回复 2021-06-30
?
回首忆惘然

TA贡献1847条经验 获得超11个赞

我通过下载vlcappimage解决了这个问题,使用--appimage-extractcli 选项解压缩它,去掉我不需要的东西,然后将它重新打包到我的 appimage 中。


查看完整回答
反对 回复 2021-06-30
  • 3 回答
  • 0 关注
  • 215 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信