在Mac OSX上使用VLCJ出现Unsatisfied Link Error(darwin/libvlc.dylib)

5

我正在尝试启动VLCJ以进行一些流媒体传输,作为我正在开发的应用程序的一部分。根据官方教程,我正在使用以下代码来尝试加载库:

NativeLibrary.addSearchPath(
    RuntimeUtil.getLibVlcLibraryName(), "/Applications/VLC/Contents/MacOS/lib"
    );
Native.loadLibrary(RuntimeUtil.getLibVlcLibraryName(), LibVlc.class);

当我运行它时,我得到了以下错误:
Exception in thread "main" java.lang.UnsatisfiedLinkError: Unable to load library 'vlc': JNA native support (darwin/libvlc.dylib) not found in resource path (/Users/iamparker/Documents/workspace/VLCStreamer/target/classes:/usr/jar/vlc/vlcj-3.0.1-javadoc.jar:/usr/jar/vlc/vlcj-3.0.1-sources.jar:/usr/jar/vlc/vlcj-3.0.1-test-sources.jar:/usr/jar/vlc/vlcj-3.0.1-tests.jar:/usr/jar/vlc/vlcj-3.0.1.jar:/usr/jar/vlc/jna-4.1.0.jar:/usr/jar/vlc/jna-platform-4.1.0.jar)
at com.sun.jna.NativeLibrary.loadLibrary(NativeLibrary.java:220)
at com.sun.jna.NativeLibrary.getInstance(NativeLibrary.java:322)
at com.sun.jna.Library$Handler.<init>(Library.java:142)
at com.sun.jna.Native.loadLibrary(Native.java:387)
at com.sun.jna.Native.loadLibrary(Native.java:366)
at com.thundercats.vlcstreamer.Main.loadNative(Main.java:33)
at com.thundercats.vlcstreamer.Main.main(Main.java:16)

看起来它甚至没有搜索我提供的路径。那个目录里有一个完好无损的libvlc.dylib。

这是运行VLCJ NativeDiscoveryTest的输出:

vlcj: (Info.java:70)                                 | INFO  | vlcj: <version not available>
vlcj: (Info.java:71)                                 | INFO  | java: 1.6.0_65 Apple Inc.
vlcj: (Info.java:72)                                 | INFO  | java home: /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home
vlcj: (Info.java:73)                                 | INFO  | os: Mac OS X 10.8.5 x86_64
vlcj: (NativeDiscovery.java:98)                      | DEBUG | discover()
vlcj: (NativeDiscovery.java:101)                     | DEBUG | jnaLibraryPath=null
vlcj: (NativeDiscovery.java:106)                     | DEBUG | discoveryStrategy=uk.co.caprica.vlcj.discovery.linux.DefaultLinuxNativeDiscoveryStrategy@42b1b4c3
vlcj: (NativeDiscovery.java:109)                     | DEBUG | supported=false
vlcj: (NativeDiscovery.java:106)                     | DEBUG | discoveryStrategy=uk.co.caprica.vlcj.discovery.windows.DefaultWindowsNativeDiscoveryStrategy@60072ffb
vlcj: (NativeDiscovery.java:109)                     | DEBUG | supported=false
vlcj: (NativeDiscovery.java:106)                     | DEBUG | discoveryStrategy=uk.co.caprica.vlcj.discovery.mac.DefaultMacNativeDiscoveryStrategy@77df38fd
vlcj: (NativeDiscovery.java:109)                     | DEBUG | supported=true
vlcj: (AbstractNativeDiscoveryStrategy.java:49)      | DEBUG | discover()
vlcj: (AbstractNativeDiscoveryStrategy.java:54)      | DEBUG | directoryNames=[/Users/iamparker/Documents/workspace/NativeDiscoveryTest, /usr/bin, /bin, /usr/sbin, /sbin, /Applications/VLC.app/Contents/MacOS/lib]
vlcj: (AbstractNativeDiscoveryStrategy.java:57)      | DEBUG | directoryName=/Users/iamparker/Documents/workspace/NativeDiscoveryTest
vlcj: (AbstractNativeDiscoveryStrategy.java:95)      | DEBUG | Failed to matched all required files
vlcj: (AbstractNativeDiscoveryStrategy.java:57)      | DEBUG | directoryName=/usr/bin
vlcj: (AbstractNativeDiscoveryStrategy.java:95)      | DEBUG | Failed to matched all required files
vlcj: (AbstractNativeDiscoveryStrategy.java:57)      | DEBUG | directoryName=/bin
vlcj: (AbstractNativeDiscoveryStrategy.java:95)      | DEBUG | Failed to matched all required files
vlcj: (AbstractNativeDiscoveryStrategy.java:57)      | DEBUG | directoryName=/usr/sbin
vlcj: (AbstractNativeDiscoveryStrategy.java:95)      | DEBUG | Failed to matched all required files
vlcj: (AbstractNativeDiscoveryStrategy.java:57)      | DEBUG | directoryName=/sbin
vlcj: (AbstractNativeDiscoveryStrategy.java:95)      | DEBUG | Failed to matched all required files
vlcj: (AbstractNativeDiscoveryStrategy.java:57)      | DEBUG | directoryName=/Applications/VLC.app/Contents/MacOS/lib
vlcj: (AbstractNativeDiscoveryStrategy.java:85)      | DEBUG | Matched 'libvlc.dylib' in '/Applications/VLC.app/Contents/MacOS/lib'
vlcj: (AbstractNativeDiscoveryStrategy.java:85)      | DEBUG | Matched 'libvlccore.dylib' in '/Applications/VLC.app/Contents/MacOS/lib'
vlcj: (AbstractNativeDiscoveryStrategy.java:88)      | DEBUG | Matched all required files
vlcj: (AbstractNativeDiscoveryStrategy.java:63)      | DEBUG | result=/Applications/VLC.app/Contents/MacOS/lib
vlcj: (NativeDiscovery.java:112)                     | DEBUG | path=/Applications/VLC.app/Contents/MacOS/lib
vlcj: (NativeDiscovery.java:114)                     | INFO  | Discovery found libvlc at '/Applications/VLC.app/Contents/MacOS/lib'
vlcj: (Test.java:34)                                 | DEBUG | found=true
vlcj: (LibVlcFactory.java:164)                       | INFO  | vlc: 2.1.4 Rincewind, changeset 2.1.4-0-g2a072be
vlcj: (LibVlcFactory.java:165)                       | INFO  | libvlc: /Applications/VLC.app/Contents/MacOS/lib/libvlc.dylib
vlcj: (Test.java:36)                                 | DEBUG | Version: {}2.1.4 Rincewind

你知道在那个路径下有两组不同的JNA jar文件吗?你应该删除其中一个。另外,你用的是哪个JDK和VLC版本?最常见的问题是混合32位和64位。你还应该尝试运行vlcj的“NativeDiscoveryTest”。我刚在OSX 10.9.2上尝试了一下,对我来说完全正常。 - caprica
我也注意到了这一点。我已经将4.1.0版本的JNA文件添加到构建路径中,并随后删除了旧版本的文件;但是,由于某种原因,在重新启动Eclipse之前,它们仍然出现在错误消息中。我编辑了我的帖子并更新了错误消息(基本上相同,减去了旧的.jar文件)。 - Parker Kemp
抱歉,我只是在研究您的另一个建议,并打算之后再发表评论。我正在使用VLC 2.1.4和JDK 6。我的VLC是64位的,我的Mac也是(从我所看到的来看,VLCJ本身并不特定于其中任何一个?)。顺便说一下,我正在运行OSX 10.8.5。 - Parker Kemp
我刚刚使用“sun.arch.data.model”属性进行了双重检查,它是一个64位的JVM。这可能是一个愚蠢的问题,但是当我在Eclipse中编译时,我该如何使用“-Djna.debug-load”参数?我将其添加到我的运行配置的“VM arguments”中,但输出中没有看到任何新内容。 - Parker Kemp
没关系...我刚刚发现了我的错误,而且它相当愚蠢。谢谢你的帮助。 - Parker Kemp
显示剩余5条评论
3个回答

4
原来这只是我的一个愚蠢错误。我给出的路径是“/Applications/VLC/Contents/MacOS/lib”,但实际上应该是“/Applications/VLC.app/Contents/MacOS/lib”。我忘记了VLC有一个“.app”扩展名。现在我要去埋头反省了。

0
cd src/main/resources/
cp -r /Applications/VLC.app/Contents/MacOS/lib darwin
rm darwin/*.*.*
cd darwin
install_name_tool -add_rpath @loader_path libvlc.dylib
mkdir vlc
cp -r /Applications/VLC.app/Contents/MacOS/plugins vlc/plugins

这是macOS版本。它对我有用。也许能帮到你。

├── kotlin
│   └── App.kt
└── resources
    └── darwin
        ├── libvlc.dylib
        ├── libvlccore.dylib
        └── vlc
            └── plugins
                ├── liba52_plugin.dylib
                ├── libaccess_concat_plugin.dylib
                ├── libaccess_imem_plugin.dylib
                ├── libaccess_mms_plugin.dylib

0

我将 vlcj 的 Maven 依赖更新为:

    <dependency>
        <groupId>uk.co.caprica</groupId>
        <artifactId>vlcj</artifactId>
        <version>3.12.1</version>
    </dependency>

它可以工作


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接