小编Nat*_*teW的帖子

在 Ubuntu 20 上安装 openJDK+openJFX 8

我正在尝试在 Ubuntu 20.10 上安装 OpenJDK 8 和 OpenJFX 8。

在 Ubuntu 上安装 openJFX 8 一直有点棘手,但我曾经能够使用这个 SO 答案中的提示来做到这一点:https : //stackoverflow.com/a/56166582/2423283以前工作得很好(我认为我使用的是 Ubuntu 19.something),但最近似乎已8u161-b12-1ubuntu2被删除。

有关更多背景信息,我正在通过自动化管道中的 docker 文件安装它。以下是 Dockerfile 的相关部分:

FROM my.company.internal.registry:443/ubuntu:latest

RUN apt -y update && \
    apt -y install \
    openjdk-8-jdk \
    openjfx=8u161-b12-1ubuntu2 \
    libopenjfx-java=8u161-b12-1ubuntu2 \
    libopenjfx-jni=8u161-b12-1ubuntu2
Run Code Online (Sandbox Code Playgroud)

这曾经运行得很好,但现在我得到:

E: Version '8u161-b12-1ubuntu2' for 'openjfx' was not found
E: Version '8u161-b12-1ubuntu2' for 'libopenjfx-java' was not found
E: Version '8u161-b12-1ubuntu2' for 'libopenjfx-jni' was not found
Run Code Online (Sandbox Code Playgroud)

到目前为止我尝试过的

我试着改变我ubuntu:latestubuntu:19:10在我 …

java ubuntu javafx-8 openjfx

10
推荐指数
3
解决办法
7767
查看次数

JavaVMInitArgs.version到底是什么意思?

我正在尝试通过JNI从C ++加载jvm,而我最初无意识地将JavaVMInitArgs.version设置为“ JNI_VERSION_1_6”,而实际上并不知道这意味着什么。

后来,我安装了Java 8,修改了我的makefile以链接新的libjvm.so并包含新的jni.h,并将我的版本更改为“ JNI_VERSION_1_8”,现在我对JNI_CreateJavaVM的调用返回-3(JNI_EVERSION)。

我切换回JNI_VERSION_1_6,并且加载正常。我检查了JNIEnv对象的版本号,发现它仍然显示1.6。出于好奇,我再次尝试使用JNI_VERSION_1_4,发现它不仅可以正常加载,而且版本仍为1.6。

因此,由于某种原因,我的可执行文件似乎仍指向libjvm.so的Java 1.6版本,这可能是我的makefile中的一个问题。我将自行调试。

对于stackoverflow的人们来说,真正的问题是“ JavaVMInitArgs.version到底意味着什么?”

我假设JNI版本与Java版本相对应(因此JNI_VERSION_1_8与JRE8某种程度上相关),但我不清楚它究竟如何影响加载的内容或如何使用它。

我的想法是,您指定的版本可能指示运行程序所需的Java的最低版本,因此,如果指定JNI_VERSION_1_X,则只要Y> = X,就可以加载任何与Java Y兼容的JVM?

而且,JNI版本仅规定了C ++与Java代码交互所需的版本,还是规定了Java代码本身的版本?换句话说,可以说我的Java代码做了一些需要Java 7的工作,但是我的C ++代码是与之隔离的,只调用了Java 4兼容的工作,那么我可以将JNI版本设置为1_4并将程序链接到Java7版本吗? libjvm.so的?

我意识到我曾经一次问过很多问题,但是如果有人可以给我描述它的工作原理,我将不胜感激。当然,如果有人对为什么我似乎无法加载Java8有所了解,我也很想听听您的建议。

编辑

我弄清楚了为什么我似乎无法在Java 8版本的libjni.so中正确链接。我已将新库正确添加到我的makefile中的-L g ++参数中,但是我的环境变量LD_LIBRARY_PATH(显然是g ++首先检查)仍指向旧的libjni.so。我将LD_LIBRARY_PATH设置为指向正确的库(我也可能刚刚删除了它),现在它运行良好。

我仍然想知道JNI_VERSION值到底是什么意思。

java-native-interface

5
推荐指数
1
解决办法
450
查看次数

在 EDT 上调用 exit() 之前,SecondaryLoop.enter() 不会阻塞

概括

由于某种原因,当我调用SecondaryLoop.enter()AWT 事件调度线程 (EDT) 时,它不会等待SecondaryLoop.exit()被调用才解除阻塞。

背景

由于我认为SecondaryLoop不是一个非常知名的课程,我简单介绍一下:

一般来说,在 EDT 上运行任何长时间执行或阻塞的代码是一个坏主意,因为这样您的应用程序将不会响应任何事件,直到该代码终止。允许EventQueue.createSecondaryLoop()您创建一个新的事件循环来处理事件,从而允许您在不损失响应能力的情况下阻止 EDT。这就是 Swing 模式对话框用来允许您在等待对话框关闭时阻止 EDT,但仍然允许对话框本身的控件能够运行。

创建SecondaryLoop实例后,您应该能够调用enter()并且它应该阻塞直到exit()被调用。

来自文档

此方法可以由任何线程(包括事件分派线程)调用。该线程将被阻塞,直到调用 exit() 方法或终止循环。在任何一种情况下,都会在事件分派线程上创建一个新的辅助循环来分派事件。

不过,我不完全确定“或循环终止”时的含义。这可能是我的问题。

测试代码

enter()在 EDT 之外的线程上调用该方法会按照我的预期阻塞:

System.out.println("Enter Loop");
Toolkit.getDefaultToolkit().getSystemEventQueue().createSecondaryLoop().enter();
System.out.println("Done (we should never get here)");
Run Code Online (Sandbox Code Playgroud)

输出:

Enter Loop
Run Code Online (Sandbox Code Playgroud)

但是,如果我们在 EDT 上调用它,它会阻塞大约一秒钟,然后继续:

Enter Loop
Run Code Online (Sandbox Code Playgroud)

输出:

Enter Loop
Done (we should never get here)
Run Code Online (Sandbox Code Playgroud)

根据 tevemadar 的评论(谢谢顺便说一句),我更新了代码以防止任何可能的垃圾收集问题:

System.out.println("Enter Loop");
try {
    SwingUtilities.invokeAndWait(() -> Toolkit.getDefaultToolkit().getSystemEventQueue().createSecondaryLoop().enter());
} catch (InvocationTargetException | InterruptedException …
Run Code Online (Sandbox Code Playgroud)

java awt event-dispatch-thread

5
推荐指数
1
解决办法
372
查看次数