R CMD javareconf找不到jni.h

dfr*_*kow 16 java r rjava

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

作为根,我做到了

$ apt-get update  && apt-get install -y --no-install-recommends \
  default-jdk default-jre libicu-dev 
Run Code Online (Sandbox Code Playgroud)

然后

$ 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.
Run Code Online (Sandbox Code Playgroud)

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

# find /usr/lib/jvm/jdk1.8.0_121/ -name jni.h
/usr/lib/jvm/jdk1.8.0_121/include/jni.h
Run Code Online (Sandbox Code Playgroud)

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

我已经在互联网上看到过这个问题的各种 帖子,但没有解决方案.

Ple*_* me 17

我不确定这里是否已经确认了答案,但我会向所有人指出Andrew Collier 的这篇文章

他的建议是:

(1) 更新所有仓库

sudo apt update -y
Run Code Online (Sandbox Code Playgroud)

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

sudo apt install -y openjdk-8-jdk openjdk-8-jre
Run Code Online (Sandbox Code Playgroud)

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

sudo R CMD javareconf JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/
Run Code Online (Sandbox Code Playgroud)

特定的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
Run Code Online (Sandbox Code Playgroud)

有关这方面的更多信息,我建议如何找到 jni.h?用于正确定位/编译此目录。


sgu*_*sgu 14

R正在寻找不同的位置:

detected JNI cpp flags    : -I/usr/lib/jvm/java/include -I/usr/lib/jvm/java/include/linux
Run Code Online (Sandbox Code Playgroud)

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

sudo apt-get install openjdk-8-jdk
Run Code Online (Sandbox Code Playgroud)


Dam*_*ini 8

有同样的问题。通过指定Java文件夹的路径进行修复。简要地说,在安装Java之后,您可能会看到这样的一行。

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

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

sudo R CMD javareconf JAVA_HOME=/usr/lib/jvm/java-9-openjdk-amd64/bin/jar
Run Code Online (Sandbox Code Playgroud)

希望这是有用的


小智 6

我通过编辑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}
Run Code Online (Sandbox Code Playgroud)