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

时间:2019-10-29 12:06:19

标签: java r ubuntu ubuntu-18.04 rjava

我有一个非常普遍的问题,那就是rJava无法在Ubuntu上正确安装。 仅在几个地方hereherehere讨论了这个问题。

基本问题是在安装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’

有很多与此紧密相关的解决方案。其中大多数使用sudo R CMD javareconf为R(also a -e variant)配置Java。 Some建议在环境变量(others say not to)中设置JAVA_HOME路径。 Others建议卸载并重新安装R,而others建议从cran安装rJava。有人推荐update alternatives。这些解决方案还有其他变种。

我已经尝试了以上所有方法的组合,但是却无济于事,所以显然做错了事。

输入echo $JAVA_HOME返回

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

我的等/环境看起来像这样

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"

当我运行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.

我在做什么错,如何正确安装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

1 个答案:

答案 0 :(得分:2)

我调查了原始海报(我们在同一地方工作),问题是在OpenJDK11中,它们在JVM驻留的某些.so文件中移动,尤其是libjvm.so Ubuntu软件包中的哪个文件现在位于/usr/lib/jvm/java-1.11.0-openjdk-amd64/lib/server/中。

这意味着即使您使用apt install r-cran-rjava安装用于rJava的Ubuntu软件包,当您尝试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

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

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

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

root(或使用sudo)一样,在/etc/ld.so.conf.d/中创建一个文件,您应使用扩展名.conf来命名文件,例如java.conf,其中包含以下行:

/usr/lib/jvm/java-1.11.0-openjdk-amd64/lib/server

然后运行root

ldconfig -v

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