Rstudio 安装xlsx包时遇到Java interpreter, rJava, jni.h 等问题的解决方法

~$ java -version

初学R语言,尝试在Rstudio中安装xlsx包

> install.packages('xlsx')

报错,/usr/lib/jvm/default-java/jre/bin/java: No such file or directory, 具体内容如下:

checking Java support in R... present:
interpreter : '/usr/lib/jvm/default-java/jre/bin/java'
archiver    : '/usr/lib/jvm/default-java/bin/jar'
compiler    : '/usr/lib/jvm/default-java/bin/javac'
header prep.: '/usr/lib/jvm/default-java/bin/javah'
cpp flags   : '-I/usr/lib/jvm/default-java/include'
java libs   : '-L/usr/lib/jvm/default-java/jre/lib/amd64/server -ljvm'
checking whether Java run-time works... ./configure: line 3736: /usr/lib/jvm/default-java/jre/bin/java: No such file or directory
no
configure: error: Java interpreter '/usr/lib/jvm/default-java/jre/bin/java' does not work
ERROR: configuration failed for package ‘rJava’
* removing ‘/home/wuqili/R/x86_64-pc-linux-gnu-library/3.2/rJava’
Warning in install.packages :
  installation of package ‘rJava’ had non-zero exit status
ERROR: dependency ‘rJava’ is not available for package ‘xlsxjars’
* removing ‘/home/wuqili/R/x86_64-pc-linux-gnu-library/3.2/xlsxjars’
Warning in install.packages :
  installation of package ‘xlsxjars’ had non-zero exit status
ERROR: dependencies ‘rJava’, ‘xlsxjars’ are not available for package ‘xlsx’
* removing ‘/home/wuqili/R/x86_64-pc-linux-gnu-library/3.2/xlsx’
Warning in install.packages :
  installation of package ‘xlsx’ had non-zero exit status

The downloaded source packages are in
	‘/tmp/RtmpIgTO8o/downloaded_packages’

既然java not work, 所以在终端输入 java -version 查看

root:~$ java -version
程序 'java' 已包含在下列软件包中:
 * default-jre
 * gcj-5-jre-headless
 * openjdk-8-jre-headless
 * gcj-4.8-jre-headless
 * gcj-4.9-jre-headless
 * openjdk-9-jre-headless
请尝试:sudo apt install <选定的软件包>

根据提示,选择安装default-jre

root:~$ sudo apt install default-jre

安装成功后,再次检查java -version

root:~$ java -version
openjdk version "1.8.0_131"
OpenJDK Runtime Environment (build 1.8.0_131-8u131-b11-2ubuntu1.16.04.3-b11)
OpenJDK 64-Bit Server VM (build 25.131-b11, mixed mode)

随后回到Rstudio, 再次安装xlsx,出现新的错误,configure: error: Cannot compile a simple JNI program.

具体错误如下:

checking whether Java run-time works... yes
checking whether -Xrs is supported... yes
checking whether JNI programs can be compiled... configure: error: Cannot compile a simple JNI program. See config.log for details.

Make sure you have Java Development Kit installed and correctly registered in R.
If in doubt, re-run "R CMD javareconf" as root.

ERROR: configuration failed for package ‘rJava’
* removing ‘/home/wuqili/R/x86_64-pc-linux-gnu-library/3.2/rJava’
Warning in install.packages :
  installation of package ‘rJava’ had non-zero exit status
ERROR: dependency ‘rJava’ is not available for package ‘xlsxjars’
* removing ‘/home/wuqili/R/x86_64-pc-linux-gnu-library/3.2/xlsxjars’
Warning in install.packages :
  installation of package ‘xlsxjars’ had non-zero exit status
ERROR: dependencies ‘rJava’, ‘xlsxjars’ are not available for package ‘xlsx’
* removing ‘/home/wuqili/R/x86_64-pc-linux-gnu-library/3.2/xlsx’
Warning in install.packages :
  installation of package ‘xlsx’ had non-zero exit status

The downloaded source packages are in
	‘/tmp/RtmpIgTO8o/downloaded_packages’

于是根据提示,在终端输入 R CMD javareconf, 显示conftest.c:1:17: fatal error: jni.h: 没有那个文件或目录

root:R CMD javareconf
Java interpreter : /usr/lib/jvm/default-java/jre/bin/java
Java version     : 1.8.0_131
Java home path   : /usr/lib/jvm/default-java
Java compiler    : not present
Java headers gen.: 
Java archive tool: 

trying to compile and link a JNI program 
detected JNI cpp flags    : 
detected JNI linker flags : -L$(JAVA_HOME)/jre/lib/amd64/server -ljvm
gcc -std=gnu99 -I/usr/share/R/include -DNDEBUG      -fpic  -g -O2 -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -g  -c conftest.c -o conftest.o
conftest.c:1:17: fatal error: jni.h: 没有那个文件或目录
compilation terminated.
/usr/lib/R/etc/Makeconf:134: recipe for target 'conftest.o' failed
make: *** [conftest.o] Error 1
Unable to compile a JNI program


JAVA_HOME        : /usr/lib/jvm/default-java
Java library path: 
JNI cpp flags    : 
JNI linker flags : 
Updating Java configuration in /usr/lib/R
Done.

使用locate jni.h没有任何输出,于是尝试:

root:sudo apt install openjdk-9-source
.....

正在处理用于 hicolor-icon-theme (0.15-0ubuntu1) 的触发器 ...
在处理时有错误发生:
 /var/cache/apt/archives/openjdk-9-jdk_9~b114-0ubuntu1_amd64.deb
E: Sub-process /usr/bin/dpkg returned an error code (1)
又报错!!!

尝试修复,还是不行

root:sudo apt-get update --fix-missing
命中:1 http://cn.archive.ubuntu.com/ubuntu xenial InRelease
命中:2 http://cn.archive.ubuntu.com/ubuntu xenial-updates InRelease
命中:3 http://cn.archive.ubuntu.com/ubuntu xenial-backports InRelease
获取:4 http://security.ubuntu.com/ubuntu xenial-security InRelease [102 kB]
获取:5 http://security.ubuntu.com/ubuntu xenial-security/main amd64 DEP-11 Metadata [60.4 kB]
获取:6 http://security.ubuntu.com/ubuntu xenial-security/main DEP-11 64x64 Icons [62.6 kB]
获取:7 http://security.ubuntu.com/ubuntu xenial-security/universe amd64 DEP-11 Metadata [51.3 kB]
获取:8 http://security.ubuntu.com/ubuntu xenial-security/universe DEP-11 64x64 Icons [85.1 kB]
已下载 362 kB,耗时 16秒 (21.5 kB/s)                                                
正在读取软件包列表... 完成

更新一下
root: sudo apt-get update

再次检查一下 sudo apt-get check

root:sudo apt-get check
正在读取软件包列表... 完成
正在分析软件包的依赖关系树       
正在读取状态信息... 完成       
您也许需要运行“apt-get -f install”来修正上面的错误。
下列软件包有未满足的依赖关系:
 openjdk-9-source : 依赖: openjdk-9-jdk (>= 9~b114-0ubuntu1) 但是它还没有被安装
E: 不能满足依赖关系。不妨试一下 -f 选项。


尝试安装 openjdk-9-jdk

root:sudo apt-get install openjdk-9-jdk
正在读取软件包列表... 完成
正在分析软件包的依赖关系树       
正在读取状态信息... 完成       
建议安装:
  openjdk-9-demo visualvm
下列【新】软件包将被安装:
  openjdk-9-jdk
升级了 0 个软件包,新安装了 1 个软件包,要卸载 0 个软件包,有 106 个软件包未被升级。
有 27 个软件包没有被完全安装或卸载。
需要下载 0 B/16.6 kB 的归档。
解压缩后会消耗 58.4 kB 的额外空间。
(正在读取数据库 ... 系统当前共安装有 223104 个文件和目录。)
正准备解包 .../openjdk-9-jdk_9~b114-0ubuntu1_amd64.deb  ...
正在解包 openjdk-9-jdk:amd64 (9~b114-0ubuntu1) ...
dpkg: 处理归档 /var/cache/apt/archives/openjdk-9-jdk_9~b114-0ubuntu1_amd64.deb (--unpack)时出错:
 正试图覆盖 /usr/lib/jvm/java-9-openjdk-amd64/include/linux/jawt_md.h,它同时被包含于软件包 openjdk-9-jdk-headless:amd64 9~b114-0ubuntu1
在处理时有错误发生:
 /var/cache/apt/archives/openjdk-9-jdk_9~b114-0ubuntu1_amd64.deb
E: Sub-process /usr/bin/dpkg returned an error code (1)

又是这个错误!!!

输入下面命令配置依赖关系

root:# sudo dpkg --configure -a
再次报错:

dpkg: 依赖关系问题使得 openjdk-9-source 的配置工作不能继续:
 openjdk-9-source 依赖于 openjdk-9-jdk (>= 9~b114-0ubuntu1);然而:
  未安装软件包 openjdk-9-jdk:amd64。

dpkg: 处理软件包 openjdk-9-source (--configure)时出错:
 依赖关系问题 - 仍未被配置
正在设置 libatk-wrapper-java (0.33.3-6) ...
正在设置 libgnomevfs2-0:amd64 (1:2.24.4-6.1ubuntu1) ...
正在设置 x11proto-core-dev (7.0.31-1~ubuntu16.04.2) ...
正在设置 libxau-dev:amd64 (1:1.0.8-1) ...
正在设置 libbonobo2-0:amd64 (2.32.1-3) ...
正在设置 libatk-wrapper-java-jni:amd64 (0.33.3-6) ...
正在设置 libxdmcp-dev:amd64 (1:1.1.2-1.1) ...
正在设置 libice-dev:amd64 (2:1.0.9-1) ...
正在设置 openjdk-9-jre:amd64 (9~b114-0ubuntu1) ...
正在设置 libxcb1-dev:amd64 (1.11.1-1ubuntu1) ...
正在设置 x11proto-input-dev (2.3.1-1) ...
正在设置 libsm-dev:amd64 (2:1.2.2-1) ...
正在设置 libgnome-2-0:amd64 (2.32.1-5ubuntu1) ...
正在设置 libx11-dev:amd64 (2:1.6.3-1ubuntu2) ...
正在设置 libxt-dev:amd64 (1:1.1.5-0ubuntu1) ...
正在处理用于 libc-bin (2.23-0ubuntu9) 的触发器 ...
在处理时有错误发生:
 openjdk-9-source

干脆去掉openjdk-9-source

root:sudo apt-get remove openjdk-9-source

接着再次检查依赖关系

root:sudo apt-get check
正在读取软件包列表... 完成
正在分析软件包的依赖关系树       
正在读取状态信息... 完成  
OK了!!!

再输入 R CMD javareconf, 还是提示 jni.h文件没有, 但是这时原来为空的Java headers gen 和 Java archive tool现在有目录了。

root: R CMD javareconf
Java interpreter : /usr/lib/jvm/default-java/jre/bin/java
Java version     : 1.8.0_131
Java home path   : /usr/lib/jvm/default-java
Java compiler    : /usr/bin/javac
Java headers gen.: /usr/bin/javah
Java archive tool: /usr/bin/jar

trying to compile and link a JNI program 
detected JNI cpp flags    : 
detected JNI linker flags : -L$(JAVA_HOME)/jre/lib/amd64/server -ljvm
gcc -std=gnu99 -I/usr/share/R/include -DNDEBUG      -fpic  -g -O2 -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -g  -c conftest.c -o conftest.o
conftest.c:1:17: fatal error: jni.h: 没有那个文件或目录
compilation terminated.
/usr/lib/R/etc/Makeconf:134: recipe for target 'conftest.o' failed
make: *** [conftest.o] Error 1
Unable to compile a JNI program


JAVA_HOME        : /usr/lib/jvm/default-java
Java library path: 
JNI cpp flags    : 
JNI linker flags : 
Updating Java configuration in /usr/lib/R
Done.

而此时再次输入locate jni.h时,已经有输出了

root:locate jni.h
/usr/lib/jvm/java-9-openjdk-amd64/include/jni.h

明明有文件,却显示没有,百度后,给出解决方法是使用gcc -I + 指定jni,h的目录,尝试后但是无效。

最后发现,除了安装jre以外,还需要安装jdk,于是

root:sudo apt-get install default-jdk

再输入 R CMD javareconf, OK了!!!

root@wuqili-Lenovo-Flex-2-14:/home/wuqili# sudo R CMD javareconf
Java interpreter : /usr/lib/jvm/default-java/jre/bin/java
Java version     : 1.8.0_131
Java home path   : /usr/lib/jvm/default-java
Java compiler    : /usr/lib/jvm/default-java/bin/javac
Java headers gen.: /usr/lib/jvm/default-java/bin/javah
Java archive tool: /usr/lib/jvm/default-java/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)/jre/lib/amd64/server -ljvm
gcc -std=gnu99 -I/usr/share/R/include -DNDEBUG -I/usr/lib/jvm/default-java/include -I/usr/lib/jvm/default-java/include/linux     -fpic  -g -O2 -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/default-java/jre/lib/amd64/server -ljvm -L/usr/lib/R/lib -lR


JAVA_HOME        : /usr/lib/jvm/default-java
Java library path: $(JAVA_HOME)/jre/lib/amd64/server
JNI cpp flags    : -I$(JAVA_HOME)/include -I$(JAVA_HOME)/include/linux
JNI linker flags : -L$(JAVA_HOME)/jre/lib/amd64/server -ljvm
Updating Java configuration in /usr/lib/R
Done.

最后回到Rstudio, 依次顺利安装rjava和xlsx包。

在最初遇到问题时,本能的上网搜求解决方法,发现网上的解答都只涉及到部分问题,没有完整的解决方案。以上是参考了很多网上方案的综合版。由于是编程小白,虽然安装成功了,但是也不知道具体的所以然。但是还是把整个过程总结下来,希望可以帮助遇到类似问题的朋友!


  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值