R CMD javareconf не находит jni.h

Я пытаюсь установить rJava в Docker-контейнер на основе Debian (Джесси) с Анакондой.

Как корень я сделал

$ 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, что потребовало бы правильных включений.

Я видел различные посты в интернете по этой проблеме, но не нашел решения.

Ответ 1

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

Ответ 2

Была та же проблема. Исправлено, указав путь к папке Java. Вкратце, после установки Java вы можете получить такую ​​строку.

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

Я указал этот путь как аргумент JAVA_HOME при вызове javareconf следующим образом.

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

Надеюсь, это полезно

Ответ 3

Я решил проблему, отредактировав файл 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}

Ответ 4

У меня уже была Java 11 на Ubuntu 18.04, но я должен был установить jdk-11.0.1, следуя этому руководству: https://websiteforstudents.com/how-to-install-oracle-java-jdk-11-on-ubuntu-18-04 -16-04-18-10/

Затем я изменил JAVA_HOME в javaconf, как @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

Последний бит может не понадобиться, в любом случае он должен иметь возможность просматривать эту папку, но это то, что я сделал.

Ответ 5

Была такая же проблема и наконец-то удалось ее исправить. После долгих поисков это сработало для меня (я в основном следовал руководству здесь: 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 явно. После того, как это закончилось успешно, я смог установить rJava в Rstudio, который мне понадобился для установки glmulti.

Ответ 6

В моем случае мне пришлось бежать

R CMD javareconf

как su, просто sudo не работает.

Ответ 7

Я не уверен, был ли здесь подтвержден ответ, но я бы указал всем на эту статью Эндрю Коллиера.

Что он рекомендует:

(1) Обновление всех репозиториев

sudo apt update -y

(2) Убедитесь, что JRE и JDK 8 установлены

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

(3) Затем, как уже говорили многие пользователи, указав R на java с явным путем к JDK 8

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

Определенный пакет Java не имеет большого значения, если он содержит все необходимое скомпилированное содержимое в каталоге /include.

[email protected]:~$ ls /usr/lib/jvm/java-8-openjdk-amd64/include/
classfile_constants.h  jdwpTransport.h  jvmticmlr.h  linux
jawt.h                 jni.h            jvmti.h

Более подробно об этом я бы порекомендовал как найти jni.h?, чтобы правильно найти/скомпилировать этот каталог.