R CMD javareconf找不到jni.h

问题描述 投票:11回答:6

我正在尝试在基于debian(jessie)和Anaconda的docker容器中安装rJava。

作为根,我做到了

$ apt-get update  && apt-get install -y --no-install-recommends \
  default-jdk default-jre libicu-dev 

然后

$ R CMD javareconf 
Java interpreter : /usr/lib/jvm/jdk1.8.0_121/jre/bin/java
Java version     : 1.8.0_121
Java home path   : /usr/lib/jvm/jdk1.8.0_121
Java compiler    : /usr/lib/jvm/jdk1.8.0_121/bin/javac
Java headers gen.: /usr/lib/jvm/jdk1.8.0_121/bin/javah
Java archive tool: /usr/lib/jvm/jdk1.8.0_121/bin/jar

trying to compile and link a JNI program 
detected JNI cpp flags    : -I/usr/lib/jvm/java/include -I/usr/lib/jvm/java/include/linux
detected JNI linker flags : -L$(JAVA_HOME)/jre/lib/amd64/server -ljvm
gcc -std=gnu99 -I/opt/conda/lib/R/include -DNDEBUG -I/usr/lib/jvm/java/include -I/usr/lib/jvm/java/include/linux -I/opt/conda/include    -fpic  -I/opt/conda/include  -c conftest.c -o conftest.o
conftest.c:1:17: fatal error: jni.h: No such file or directory
 #include <jni.h>
                 ^
compilation terminated.
/opt/conda/lib/R/etc/Makeconf:133: recipe for target 'conftest.o' failed
make: *** [conftest.o] Error 1
Unable to compile a JNI program


JAVA_HOME        : /usr/lib/jvm/jdk1.8.0_121
Java library path: 
JNI cpp flags    : 
JNI linker flags : 
Updating Java configuration in /opt/conda/lib/R
Done.

但jni.h在JDK中是正确的:

# find /usr/lib/jvm/jdk1.8.0_121/ -name jni.h
/usr/lib/jvm/jdk1.8.0_121/include/jni.h

它看起来不像javareconf找到它。而且,如果我查看我可以使用javareconf设置的所有变量,比如JAVA_HOME,我看不到能够设置JNI cpp标志,这需要正确的包含。

我已经在互联网上看到various posts这个问题,但没有解决方案。

java r rjava
6个回答
13
投票

R正在寻找不同的位置:

detected JNI cpp flags    : -I/usr/lib/jvm/java/include -I/usr/lib/jvm/java/include/linux

我遇到了类似的问题,但安装jdk后一切都很好:

sudo apt-get install openjdk-8-jdk

6
投票

有同样的问题。通过指定Java文件夹的路径来修复。简而言之,在安装Java之后,您可能会得到这样的一行。

update-alternatives: using /usr/lib/jvm/java-9-openjdk-amd64/bin/jar to provide /usr/bin/jar (jar) in auto mode

我在调用javareconf时将该路径指定为JAVA_HOME参数,如下所示。

sudo R CMD javareconf JAVA_HOME=/usr/lib/jvm/java-9-openjdk-amd64/bin/jar

希望这很有用


4
投票

我通过编辑java-config文件解决了这个问题

sudo nano /usr/lib/R/etc/javaconf

set the correct JAVA_HOME in this row:
: ${JAVA_HOME=/usr/local/java/jdk-9.0.1}

1
投票

我已经在ubuntu 18.04上安装了Java 11,但是必须按照本指南安装jdk-11.0.1:https://websiteforstudents.com/how-to-install-oracle-java-jdk-11-on-ubuntu-18-04-16-04-18-10/

然后我改变了javaconf中的JAVA_HOME,就像@Spanska Forteva一样

sudo nano /usr/lib/R/etc/javaconfIn javaconf 

我发现仍然指定了旧版java的路径。

## Versions from settings when configure was run
: ${JAVA_HOME=/usr/lib/jvm/default-java}
: ${JAVA_CPPFLAGS=~autodetect~}
: ${JAVA_LD_LIBRARY_PATH=~autodetect~}
: ${JAVA_LIBS=~autodetect~}

我将JAVA_HOME的路径更改为新安装的jdk:

: ${JAVA_HOME=/usr/lib/jvm/jdk-11.0.1}

然后使用指定的jni.h路径运行CMD:

sudo R CMD javareconf /usr/lib/jvm/jdk-11.0.1/include/jni.h

可能不需要最后一点,它应该能够查看该文件夹,但这就是我所做的。


1
投票

有同样的问题,最终可以解决它。经过大量的搜索,这对我有用(我基本上遵循了这里的指南:https://www3.ntu.edu.sg/home/ehchua/programming/howto/JDK_Howto.html):

  • 下载并解压缩JDK(jdk1.8.0_201)到/ usr / java /
  • 下载JRE(jre1.8.0_201)并将其解压缩到/ usr / java /(不确定我是否需要这个步骤,但我之前尝试解决了这个问题)
  • 使用适当的版本通知Ubuntu新的java

为此,我跑了:

$ sudo update-alternatives --install "/usr/bin/java" "java" "/usr/java/jdk1.8.0_201/bin/java" 1

$ sudo update-alternatives --install "/usr/bin/javac" "javac" "/usr/java/jdk1.8.0_201/bin/javac" 1

$ sudo update-alternatives --install "/usr/bin/javaws" "javaws" "/usr/java/jdk1.8.0_201/bin/javaws" 1

其次是

$ sudo update-alternatives --set java /usr/java/jdk1.8.0_201/bin/java

$ sudo update-alternatives --set javac /usr/java/jdk1.8.0_201/bin/javac

$ sudo update-alternatives --set javaws /usr/java/jdk1.8.0_201/bin/javaws

然后我终于可以在替代品中看到我的java了

sudo update-alternatives --config java

我在哪里选择了新安装的java。然后我跑了

 sudo R CMD javareconf JAVA_HOME=/usr/java/jdk1.8.0_201/bin/

其中我明确指定了我的java jdk路径。在成功完成后,我能够在Rstudio中安装rJava,我需要安装glmulti。


1
投票

在我的情况下,我不得不跑

R CMD javareconf

作为su,只是sudo没有工作。

© www.soinside.com 2019 - 2024. All rights reserved.