web-dev-qa-db-fra.com

R CMD javareconf ne trouve pas jni.h

J'essaie d'installer rJava dans un conteneur Docker basé sur Debian (Jessie) avec Anaconda.

En tant que root, je l'ai fait

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

Alors

$ 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.

Mais jni.h a raison dans le JDK:

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

Il ne semble pas que javareconf le trouve. Et, si je regarde toutes les variables que je pourrais définir avec javareconf, comme Java_HOME, je ne vois pas la possibilité de définir des drapeaux JNI cpp, qui auraient besoin des bons inclus.

J'ai vu diversmessages sur Internet de ce problème, mais aucune solution.

13
dfrankow

R regarde un endroit différent:

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

J'ai rencontré un problème similaire, mais tout va bien après l'installation de jdk:

Sudo apt-get install openjdk-8-jdk
14
sgu

Eu le même problème. Résolu en spécifiant le chemin d'accès au dossier Java. Brièvement, après avoir installé Java, vous pouvez obtenir une ligne comme celle-ci.

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

J'ai spécifié ce chemin comme argument Java_HOME lors de l'appel de javareconf, comme suit.

Sudo R CMD javareconf Java_HOME=/usr/lib/jvm/Java-9-openjdk-AMD64/bin/jar

J'espère que c'est utile

7
Damiano Fantini

J'ai résolu le problème en éditant le fichier 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}
6
Spaska Forteva

J'avais déjà Java 11 sur Ubuntu 18.04 mais j'ai dû installer jdk-11.0.1 en suivant ce guide: https://websiteforstudents.com/how-to-install-Oracle- Java-jdk-11-on-ubuntu-18-04-16-04-18-10 /

J'ai ensuite changé Java_HOME dans javaconf, tout comme @Spanska Forteva

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

J'ai trouvé que le chemin vers une ancienne version de Java était toujours spécifié.

## 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~}

J'ai changé le chemin vers Java_HOME vers mon jdk nouvellement installé:

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

Puis a exécuté le CMD avec le chemin d'accès à jni.h spécifié:

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

Le dernier bit n'est peut-être pas nécessaire, il devrait de toute façon pouvoir regarder dans ce dossier, mais c'est ce que j'ai fait.

1
chilifan

Je ne sais pas si une réponse a été confirmée ici, mais je voudrais signaler à tout le monde article par Andrew Collier.

Ce qu'il recommande:

(1) Mise à jour de tous les référentiels

Sudo apt update -y

(2) S'assurer que JRE et JDK 8 sont installés

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

(3) Ensuite, comme de nombreux utilisateurs l'ont déjà dit, pointant R vers Java avec un chemin explicite vers JDK 8

Sudo R CMD javareconf Java_HOME=/usr/lib/jvm/Java-8-openjdk-AMD64/

Le package spécifique Java n'a pas trop d'importance tant qu'il a tout le contenu compilé nécessaire dans le répertoire/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

Pour en savoir plus, je recommanderais comment faire pour que jni.h soit trouvé? = pour avoir localisé/compilé correctement ce répertoire.

1

A eu le même problème et a finalement pu le résoudre. Après beaucoup de recherches, cela a fonctionné pour moi (j'ai essentiellement suivi le guide ici: https://www3.ntu.edu.sg/home/ehchua/programming/howto/JDK_Howto.html ):

  • téléchargement et décompression du JDK (jdk1.8.0_201) vers/usr/Java /
  • télécharger et décompresser le JRE (jre1.8.0_201) vers/usr/Java/(je ne sais pas si j'avais besoin de cette étape mais je l'ai fait lors de tentatives précédentes pour résoudre ce problème)
  • Informer Ubuntu du nouveau Java en utilisant les versions appropriées

Pour cela, j'ai couru:

$ 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

suivi par

$ 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

Ensuite, je pouvais enfin voir mon Java dans les alternatives de

Sudo update-alternatives --config Java

où j'ai sélectionné le Java nouvellement installé. Puis j'ai couru

 Sudo R CMD javareconf Java_HOME=/usr/Java/jdk1.8.0_201/bin/

dans lequel j'ai spécifié à nouveau mon chemin Java jdk explicitement. Après cela, j'ai réussi à installer rJava dans Rstudio dont j'avais besoin pour installer glmulti.

1
Obnebion

Dans mon cas, j'ai dû courir

R CMD javareconf

comme su, juste Sudo ne fonctionnait pas.

1