在 R 3.6 上为 ubuntu 仿生海狸安装 rJava 时出现“无法运行简单的 JNI 程序”错误消息

Jon*_*rne 8 java ubuntu r rjava ubuntu-18.04

我有一个非常常见的问题,即 rJava 无法在 Ubuntu 上正确安装。此问题已在此处此处此处等多个地方讨论过。

基本问题是,在安装rJava包时,产生以下错误信息

configure: error: Unable to run a simple JNI program. Make sure you have configured R with Java support (see R documentation) and check config.log for failure reason.
Warning in system(cmd) : error in running command
ERROR: configuration failed for package ‘rJava’
* removing ‘/home/jonno/R/x86_64-pc-linux-gnu-library/3.6/rJava’
Run Code Online (Sandbox Code Playgroud)

这个问题有各种密切相关的解决方案。它们中的大多数sudo R CMD javareconf用于为 R 配置 Java(也是一个-e变体)。有些人建议JAVA_HOME在环境变量中设置路径(其他人说不要)。其他人建议卸载并重新安装 R,而其他人建议从 cran 安装 rJava。有几个人推荐update alternatives。这些解决方案还有其他变体。

我已经尝试了上述所有方法的组合,但一无所获,所以我显然做错了什么。

输入echo $JAVA_HOME回报

/usr/lib/jvm/java-11-openjdk-amd64

我的 etc/environment 看起来像这样

PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/$
MKL_THREADING_LAYER=GNU
JAVA_HOME="/usr/lib/jvm/java-11-openjdk-amd64"
Run Code Online (Sandbox Code Playgroud)

当我运行 R CMD javaconf 时,它看起来像这样

Java interpreter : /usr/lib/jvm/java-11-openjdk-amd64/java
Java version     : 11.0.4
Java home path   : /usr/lib/jvm/java-11-openjdk-amd64
Java compiler    : /usr/lib/jvm/java-11-openjdk-amd64/bin/javac
Java headers gen.: /usr/bin/javah
Java archive tool: /usr/lib/jvm/java-11-openjdk-amd64/bin/jar

trying to compile and link a JNI program 
detected JNI cpp flags    : -I$(JAVA_HOME)/include -I$(JAVA_HOME)/include/linux
detected JNI linker flags : -L$(JAVA_HOME)/lib/server -ljvm
gcc -std=gnu99 -I"/usr/share/R/include" -DNDEBUG -I/usr/lib/jvm/java-11-openjdk-amd64/include -I/usr/lib/jvm/java-11-openjdk-amd64/include/linux    -fpic  -g -O2 -fdebug-prefix-map=/build/r-base-uuRxut/r-base-3.6.1=. -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -g  -c conftest.c -o conftest.o
gcc -std=gnu99 -shared -L/usr/lib/R/lib -Wl,-Bsymbolic-functions -Wl,-z,relro -o conftest.so conftest.o -L/usr/lib/jvm/java-11-openjdk-amd64/lib/server -ljvm -L/usr/lib/R/lib -lR


JAVA_HOME        : /usr/lib/jvm/java-11-openjdk-amd64
Java library path: $(JAVA_HOME)/lib/server
JNI cpp flags    : -I$(JAVA_HOME)/include -I$(JAVA_HOME)/include/linux
JNI linker flags : -L$(JAVA_HOME)/lib/server -ljvm
Updating Java configuration in /usr/lib/R
Done.
Run Code Online (Sandbox Code Playgroud)

我做错了什么,如何正确安装 rJava?

编辑:

使用sudo apt-get install r-cran-rjava我知道成功安装 rJava 后 会出现以下错误

Error: package or namespace load failed for ‘rJava’:
 .onLoad failed in loadNamespace() for 'rJava', details:
  call: dyn.load(file, DLLpath = DLLpath, ...)
  error: unable to load shared object '/usr/lib/R/site-library/rJava/libs/rJava.so':
  libjvm.so: cannot open shared object file: No such file or directory
Run Code Online (Sandbox Code Playgroud)

owa*_*way 13

我已经调查过原始海报(我们在同一个地方工作),问题是在 OpenJDK11 中,他们移动.so了 JVM 所在的一些文件,特别libjvm.so是 Ubuntu 包中的/usr/lib/jvm/java-1.11.0-openjdk-amd64/lib/server/.

这意味着即使你安装了 rJava 的 Ubuntu 包,apt install r-cran-rjava当你尝试library(rJava).

解决方案是通过添加以下内容/usr/lib/jvm/java-1.11.0-openjdk-amd64/lib/server/$LD_LIBRARY_PATH添加:

export LD_LIBRARY_PATH=/usr/lib/jvm/java-1.11.0-openjdk-amd64/lib/server:$LD_LIBRARY_PATH
Run Code Online (Sandbox Code Playgroud)

到您的末尾~/.bashrc并开始一个新的 shell(或source ~/.bashrc)。

这是我们必须为 OpenJDK 的中央安装修复的问题,例如:https : //github.com/UCL-RITS/rcps-buildscripts/blob/master/adoptopenjdk-11.0.3_install.sh#L46

如果要使用从 Gnome 启动的 Rstudio 进行此操作,则需要将该目录添加到ldconfig.

As root(或 with sudo)创建一个文件/etc/ld.so.conf.d/,您应该在其中调用带有.conf扩展名的内容,例如java.conf包含以下行:

/usr/lib/jvm/java-1.11.0-openjdk-amd64/lib/server
Run Code Online (Sandbox Code Playgroud)

然后作为root运行

ldconfig -v
Run Code Online (Sandbox Code Playgroud)

这应该将目录添加到通过 GNOME 搜索启动的可执行文件的位置。问题的这一特定部分(GNOME 忽略 中的设置bashrc)在 Ubuntu 中一直是一个问题,至少从 9.04 开始(https://bugs.launchpad.net/ubuntu/+source/xorg/+bug/366728/)。

  • 我只是想补充一下我所做的事情以供将来参考。由于我的 Java 安装不同,正确的做法是首先找到 `libjvm.so`:`find /usr/lib/jvm/<java-dir>/**/libjvm.so`,然后添加该文件夹(在根据此答案,将我的案例“jre/lib/amd64/server”)更改为“LD_LIBRARY_PATH”。(只是想指出这一点,以便其他人更容易遵循)。 (3认同)
  • 答案的前半部分意味着,如果您从终端启动 rstudio,rJava 将工作,但如果您双击 Rstudio 图标,rJava 将无法工作。答案的第二部分意味着您可以以正常方式启动 Rstudio(使用图标)并且 rJava 可以工作。前半部分更容易做到,但后半部分意味着您在启动 rstudio 时不需要改变您的行为。 (2认同)