简体   繁体   中英

VLCJ fullScreen Error Unable to load library 'X11': JNA native support (win32-x86/X11.dll)

I'm doing a Java based media-player but I have a problem showing the video in full screen.

When I use components.getMediaPlayer().setFullScreen(true); I get the following error:

Exception in thread "JavaFX Application Thread" java.lang.UnsatisfiedLinkError: Unable to load library 'X11': JNA native support (win32-x86/X11.dll) not found in resource path

I use a JVM 32Bit, JNA 3.5.2 and VLCJ 3.0.1.

From what I have seen is loading the 32bit libraries but my OS is 64bit. Is this the problem?

It looks like you are trying to load the X11 library in Windows.

That is not going to work.

vlcj uses the X11 native library on Linux to switch a Java JFrame to full-screen.

On Windows, vlcj provides a different native solution using the Win32 API.

So on Windows you can do something like this when you create your media player:

    mediaPlayerComponent = new EmbeddedMediaPlayerComponent() {
        @Override
        protected FullScreenStrategy onGetFullScreenStrategy() {
            return new Win32FullScreenStrategy(frame);
        }
    };

On Linux you would use something like this:

    mediaPlayerComponent = new EmbeddedMediaPlayerComponent() {
        @Override
        protected FullScreenStrategy onGetFullScreenStrategy() {
            return new XFullScreenStrategy(frame);
        }
    };

Of course if you want to support either/or, you can make a conditional check at runtime, something like:

    mediaPlayerComponent = new EmbeddedMediaPlayerComponent() {
        @Override
        protected FullScreenStrategy onGetFullScreenStrategy() {
            if (RuntimeUtil.isWindows()) {
                return new Win32FullScreenStrategy(frame);
            }
            else {
                return new XFullScreenStrategy(frame);
            }
        }
    };

Why is full-screen functionality implemented this way?

It is because full-screen functionality using core Java is unreliable - on some Windows versions it may be full-screen apart from the task bar for example, and on some Linux window managers it may not work at all.

To answer your question about 32-bit DLL vs 64-bit OS: what matters here is whether your JVM architecture is 32-bit, ie the JVM architecture must match the architecture of the shared libraries that you are trying to load.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM