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, что потребовало бы правильных включений.
Я видел различные посты в интернете по этой проблеме, но не нашел решения.
8 ответов
Я не уверен, что ответ был подтвержден здесь, но я бы указал всем на эту статью Эндрю Коллиера.
Что он рекомендует:
(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.
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
Более подробно я бы порекомендовал, как найти jni.h? для правильного поиска / компиляции этого каталога.
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
Была такая же проблема. Исправлено путем указания пути к папке 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
Надеюсь, это полезно
Я решил проблему, отредактировав файл 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}
У меня уже была 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
Последний бит может не понадобиться, в любом случае он должен иметь возможность просматривать эту папку, но это то, что я сделал.
Была такая же проблема и наконец-то удалось ее исправить. После долгих поисков это сработало для меня (я в основном следовал руководству здесь: 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.
В моем случае мне пришлось бежать
R CMD javareconf
как su
, просто sudo
не работал
Для пользователя Ubuntu 22.04:openjdk-19-jdk
&openjdk-19-jre
доступны. Их установка также решает проблему. Поэтому лучше используйте последнюю доступную версию:
sudo apt update -y
sudo apt install -y openjdk-19-jdk openjdk-19-jre
sudo R CMD javareconf JAVA_HOME=/usr/lib/jvm/java-19-openjdk-amd64/