首页 > 解决方案 > Ubuntu 20.04 上的 JNA 未定义符号

问题描述

我正在尝试使用 JNA 加载本机库,使用以下行:

MPV INSTANCE = Native.load("mpv", MPV.class, Map.of(Library.OPTION_STRING_ENCODING, "UTF-8"));

这在我安装在我的主机上的 Hyper-V VM 中的 Ubuntu 20.04 上工作得非常好,但由于某种原因在 Ubuntu 20.04 本机安装上失败。

失败的日志如下所示:

    Looking in classpath from {0} for {1}
    Found library resource at {0}
    Extracting library to {0}
    Trying {0}
    Found jnidispatch at {0}
    Looking for library 'mpv'
    Adding paths from jna.library.path: null
    Trying libmpv.so
    Loading failed with message: libmpv.so: cannot open shared object file: No such file or directory
    Adding system paths: [/usr/lib/x86_64-linux-gnu, /lib/x86_64-linux-gnu, /usr/lib64, /lib64, /usr/lib, /lib, /lib/i386-linux-gnu, /usr/lib/x86_64-linux-gnu/libfakeroot]
    Trying libmpv.so
    Loading failed with message: libmpv.so: cannot open shared object file: No such file or directory
    Looking for version variants
    Trying /usr/lib/x86_64-linux-gnu/libmpv.so.1.107.0
    Loading failed with message: /lib/x86_64-linux-gnu/libavfilter.so.7: undefined symbol: av_sscanf, version LIBAVUTIL_56
    Looking in classpath from {0} for {1}
    Loading failed with message: Native library (linux-x86-64/libmpv.so) not found in resource path ([file:/home/xxx/yyy/mpv.jar])
    Exception in thread "JavaFX Application Thread"
    java.lang.UnsatisfiedLinkError: Unable to load library 'mpv':
    libmpv.so: cannot open shared object file: No such file or directory
    libmpv.so: cannot open shared object file: No such file or directory
    /lib/x86_64-linux-gnu/libavfilter.so.7: undefined symbol: av_sscanf, version LIBAVUTIL_56
    Native library (linux-x86-64/libmpv.so) not found in resource path ([file:/home/xxx/yyy/mpv.jar])
        at com.sun.jna.NativeLibrary.loadLibrary(NativeLibrary.java:302)
        at com.sun.jna.NativeLibrary.getInstance(NativeLibrary.java:455)
        at com.sun.jna.Library$Handler.<init>(Library.java:192)
        at com.sun.jna.Native.load(Native.java:596)
        at hs.mediasystem.ext.mpv.MPV.<clinit>(MPV.java:12)
        at hs.mediasystem.ext.mpv.MPVPlayer.<init>(MPVPlayer.java:47)
        (... snipped 50 lines ...)
        at com.sun.glass.ui.View.handleKeyEvent(View.java:547)
        at com.sun.glass.ui.View.notifyKey(View.java:971)
        at com.sun.glass.ui.gtk.GtkApplication._runLoop(Native Method)
        at com.sun.glass.ui.gtk.GtkApplication.lambda$runLoop$11(GtkApplication.java:277)
        at java.base/java.lang.Thread.run(Thread.java:834)
        Suppressed: java.lang.UnsatisfiedLinkError: libmpv.so: cannot open shared object file: No such file or directory
            at com.sun.jna.Native.open(Native Method)
            at com.sun.jna.NativeLibrary.loadLibrary(NativeLibrary.java:191)
            ... 70 more
        Suppressed: java.lang.UnsatisfiedLinkError: libmpv.so: cannot open shared object file: No such file or directory
            at com.sun.jna.Native.open(Native Method)
            at com.sun.jna.NativeLibrary.loadLibrary(NativeLibrary.java:204)
            ... 70 more
        Suppressed: java.lang.UnsatisfiedLinkError: /lib/x86_64-linux-gnu/libavfilter.so.7: undefined symbol: av_sscanf, version LIBAVUTIL_56
            at com.sun.jna.Native.open(Native Method)
            at com.sun.jna.NativeLibrary.loadLibrary(NativeLibrary.java:235)
            ... 70 more
        Suppressed: java.io.IOException: Native library (linux-x86-64/libmpv.so) not found in resource path ([file:/home/john/Downloads/MediaSystem/ui-plugins/mpv-plugin/mpv.jar])
            at com.sun.jna.Native.extractFromResourcePath(Native.java:1095)
            at com.sun.jna.NativeLibrary.loadLibrary(NativeLibrary.java:276)
            ... 70 more

由于某种原因,它无法av_sscanf在依赖库中找到某些符号。然而奇怪的是,这个完全相同的代码在安装在 VM 中的 Ubuntu 中工作。

它的输出是:

Looking in classpath from {0} for {1}
Found library resource at {0}
Extracting library to {0}
Trying {0}
Found jnidispatch at {0}
Looking for library 'mpv'
Adding paths from jna.library.path: null
Trying libmpv.so
Loading failed with message: libmpv.so: cannot open shared object file: No such file or directory
Adding system paths: [/usr/lib/x86_64-linux-gnu, /lib/x86_64-linux-gnu, /usr/lib64, /lib64, /usr/lib, /lib]
Trying libmpv.so
Loading failed with message: libmpv.so: cannot open shared object file: No such file or directory
Looking for version variants
Trying /usr/lib/x86_64-linux-gnu/libmpv.so.1.107.0
Found library 'mpv' at /usr/lib/x86_64-linux-gnu/libmpv.so.1.107.0

我检查了所涉及库的版本和大小,它们似乎都完全相同:

john@Artec:~$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 20.04 LTS
Release:    20.04
Codename:   focal
john@Artec:~$ apt-cache policy libmpv1
libmpv1:
  Installed: 0.32.0-1ubuntu1
  Candidate: 0.32.0-1ubuntu1
  Version table:
 *** 0.32.0-1ubuntu1 500
        500 http://nl.archive.ubuntu.com/ubuntu focal/universe amd64 Packages
        100 /var/lib/dpkg/status
john@Artec:~$ apt-cache policy libavfilter7
libavfilter7:
  Installed: 7:4.2.2-1ubuntu1
  Candidate: 7:4.2.2-1ubuntu1
  Version table:
 *** 7:4.2.2-1ubuntu1 500
        500 http://nl.archive.ubuntu.com/ubuntu focal/universe amd64 Packages
        100 /var/lib/dpkg/status
john@Artec:~$ ll /usr/lib/x86_64-linux-gnu/libmpv.so.1.107.0 
-rw-r--r-- 1 root root 2153952 jan 31 19:11 /usr/lib/x86_64-linux-gnu/libmpv.so.1.107.0
john@Artec:~$ ll /usr/lib/x86_64-linux-gnu/libavfilter.so.7
-rw-r--r-- 1 root root 3647472 mrt  7 09:39 /usr/lib/x86_64-linux-gnu/libavfilter.so.7.57.100

任何有关如何进一步调试的提示将不胜感激。

更多信息

事实证明,这是一个加载两个库但需要不同版本的共享依赖库的问题(在这种情况下,libavfilteropencv/ffmpeg 和 libmpv 都使用该库,但它们需要稍微不同的版本......)。

标签: javaubuntujna

解决方案


推荐阅读