【问题标题】:R CMD javareconf not finding jni.hR CMD javareconf没有找到jni.h
【发布时间】:2017-07-22 13:50:24
【问题描述】:

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

作为root,我做到了

$ 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 标志的能力,这需要正确的包含。

我在网上看到过variousposts这个问题,但没有解决办法。

【问题讨论】:

标签: java r rjava


【解决方案1】:

我不确定这里是否已经确认了答案,但我会向大家指出 Andrew Collier 的 article

他的建议:

(1) 更新所有仓库

sudo apt update -y

(2) 确保已安装 JRE 和 JDK 8

sudo apt install -y openjdk-8-jdk openjdk-8-jre

(3) 然后,正如许多用户已经说过的那样,将 R 指向带有 JDK 8 的显式路径的 java

sudo R CMD javareconf JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/

具体的 Java 包并不重要,只要它在 /include 目录中包含所有必要的编译内容即可。

user@laptop:~$ ls /usr/lib/jvm/java-8-openjdk-amd64/include/
classfile_constants.h  jdwpTransport.h  jvmticmlr.h  linux
jawt.h                 jni.h            jvmti.h

关于这方面的更多信息,我会推荐 how to make jni.h be found? 来正确定位/编译这个目录。

【讨论】:

  • 没有指向明确的路径是我的问题。该解决方案在 Ubuntu 18.04 中使用 R 3.6.3 为我工作。
【解决方案2】:

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

【讨论】:

  • 首先检查 jdk 是否已安装但未正确引用可能很有用,请参阅 Damiano Fantini 的回答。如果不是你的方式很有价值,谢谢!
【解决方案3】:

有同样的问题。通过指定 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

希望对你有用

【讨论】:

  • 哇,这在浏览 R、Java、rJava 和 macOS 问题 3 小时后救了我……我已经导出了我的 JAVA_HOME,但是当我调用 R CMD javareconf 时,它仍在使用不同的路径。
  • 使用 Java 8,以下命令对我有用:sudo R CMD javareconf JAVA_HOME=/usr/lib/jvm/adoptopenjdk-8-hotspot-amd64。 (我使用stackoverflow.com/a/59436618/2251463 在 Debian 10 Buster 上安装 Java 8)。
【解决方案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}

【讨论】:

    【解决方案5】:

    我已经在 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}
    

    然后运行 ​​CMD 并指定 jni.h 的路径:

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

    最后一点可能不需要,它应该可以在那个文件夹中查找,但我就是这样做的。

    【讨论】:

      【解决方案6】:

      遇到了同样的问题,终于可以解决了。经过大量搜索,这对我有用(我基本上遵循这里的指南: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。

      【讨论】:

        【解决方案7】:

        就我而言,我不得不跑

        R CMD javareconf
        

        作为su,只是sudo 不起作用。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-11-28
          • 1970-01-01
          • 2018-05-13
          相关资源
          最近更新 更多