web-dev-qa-db-fra.com

comment faire pour que jni.h soit trouvé?

Dans Ubuntu 12.04, jdk7 de Sun/Oracle est installé. Lorsque locate jni.h, il imprime plusieurs emplacements 

/usr/lib/jvm/Java-6-openjdk-AMD64/include/jni.h
/usr/lib/jvm/jdk1.7.0_07/include/jni.h
...

Dans le fichier d’en-tête généré par JDK, il y a include <jni.h> et actuellement il se plaint. 

fatal error: jni.h: No such file or directory.

Dans ma Makefile, il n'y a aucune spécification des emplacements où jni.h est. Et je demande s'il est possible de configurer certains paramètres système pour que le chemin de jni.h (disons, /usr/lib/jvm/jdk1.7.0_07/include/jni.h) soit connu lors de la compilation.

51
Richard

Vous devez dire à votre compilateur où se trouve le répertoire include. Quelque chose comme ça:

gcc -I/usr/lib/jvm/jdk1.7.0_07/include

Mais cela dépend de votre makefile.

28
jdb

Il a besoin des fichiers jni.h et jni_md.h, essayez ceci

gcc -I/usr/lib/jvm/jdk1.7.0_07/include \
  -I/usr/lib/jvm/jdk1.7.0_07/include/linux filename.c

Cela inclura à la fois les fichiers JNI et ceux nécessaires pour linux

18
yogesh singh

L'installation du kit de développement OpenJDK (JDK) devrait résoudre votre problème.

Sudo apt-get install openjdk-X-jdk

Cela devrait vous permettre de compiler sans problèmes.

12
hgaronfolo

Utilisez le code suivant:

make -I/usr/lib/jvm/jdk*/include

où jdk * est le nom du répertoire de votre installation de jdk (par exemple, jdk1.7.0).

Et il n'y aurait pas de solution à l'échelle du système puisque le nom du répertoire serait différent avec différentes versions de JDK téléchargées et installées. Si vous souhaitez une solution automatisée, veuillez inclure toutes les commandes dans un seul script et exécuter ce script dans Terminal.

6
user2925073

Définir Java_INCLUDE_DIR à l'emplacement où se trouve jni.h devrait résoudre votre problème (définir CPPFLAGS ne fonctionnait pas pour moi).

En supposant que ce soit/usr/lib64/Java/include;

export Java_INCLUDE_DIR=/usr/lib64/Java/include
2
karanis

Je définis habituellement ma variable Java_HOME comme suit:

export Java_HOME=/usr/lib/jvm/Java/

Vous y trouverez les fichiers d'inclusion nécessaires. J'ajoute parfois le texte ci-dessous à mon .barshrc lorsque je compile beaucoup de choses qui en ont besoin.

1
Leo Ufimtsev

Aucune des solutions affichées n'a fonctionné pour moi.

Je devais vi dans mon Makefile et modifier le chemin pour que le chemin du dossier include et du sous-système de système d'exploitation (dans mon cas, -I/usr/lib/jvm/Java-8-openjdk-AMD64/include/linux) soit correct. Cela m'a permis d'exécuter make et make install sans problème.

1
bphilipnyc

Pour moi, il suffisait de s’assurer d’inclure l’installation de JDK (je n’avais eu que le JRE). Ma sortie R CMD javareconf ressemblait à ceci:

Java interpreter : /usr/lib/jvm/Java-8-openjdk-AMD64/jre/bin/Java
Java version     : 1.8.0_191
Java home path   : /usr/lib/jvm/Java-8-openjdk-AMD64/jre
Java compiler    : not present
Java headers gen.:
Java archive tool:

trying to compile and link a JNI program
detected JNI cpp flags    :
detected JNI linker flags : -L$(Java_HOME)/lib/AMD64/server -ljvm
gcc -std=gnu99 -I/usr/share/R/include -DNDEBUG      -fpic  -g -O2 -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -g  -c conftest.c -o conftest.o
conftest.c:1:17: fatal error: jni.h: No such file or directory
compilation terminated.
/usr/lib/R/etc/Makeconf:159: recipe for target 'conftest.o' failed
make: *** [conftest.o] Error 1
Unable to compile a JNI program


Java_HOME        : /usr/lib/jvm/Java-8-openjdk-AMD64/jre
Java library path:
JNI cpp flags    :
JNI linker flags :
Updating Java configuration in /usr/lib/R
Done.

Et en effet, il n'y avait pas de fichier include dans mon $Java_HOME. Remède très simple:

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

(notez que ceci est spécifiquement destiné à installer le openJDK et pas celui d'Oracle)

Après tout va bien:

Java interpreter : /usr/lib/jvm/Java-8-openjdk-AMD64/jre/bin/Java
Java version     : 1.8.0_191
Java home path   : /usr/lib/jvm/Java-8-openjdk-AMD64/jre
Java compiler    : /usr/lib/jvm/Java-8-openjdk-AMD64/jre/../bin/javac
Java headers gen.: /usr/lib/jvm/Java-8-openjdk-AMD64/jre/../bin/javah
Java archive tool: /usr/lib/jvm/Java-8-openjdk-AMD64/jre/../bin/jar

trying to compile and link a JNI program
detected JNI cpp flags    : -I$(Java_HOME)/../include -I$(Java_HOME)/../include/linux
detected JNI linker flags : -L$(Java_HOME)/lib/AMD64/server -ljvm
gcc -std=gnu99 -I/usr/share/R/include -DNDEBUG -I/usr/lib/jvm/Java-8-openjdk-AMD64/jre/../include -I/usr/lib/jvm/Java-8-openjdk-AMD64/jre/../include/linux     -fpic  -g -O2 -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -g  -c conftest.c -o conftest.o
g++ -shared -L/usr/lib/R/lib -Wl,-Bsymbolic-functions -Wl,-z,relro -o conftest.so conftest.o -L/usr/lib/jvm/Java-8-openjdk-AMD64/jre/lib/AMD64/server -ljvm -L/usr/lib/R/lib -lR


Java_HOME        : /usr/lib/jvm/Java-8-openjdk-AMD64/jre
Java library path: $(Java_HOME)/lib/AMD64/server
JNI cpp flags    : -I$(Java_HOME)/../include -I$(Java_HOME)/../include/linux
JNI linker flags : -L$(Java_HOME)/lib/AMD64/server -ljvm
Updating Java configuration in /usr/lib/R
Done.
0
MichaelChirico

Je ne sais pas si cela s’applique dans ce cas, mais le fichier est parfois supprimé pour des raisons inconnues. Vous pouvez le copier à nouveau dans le dossier correspondant pour résoudre le problème.

0
el científico

Les réponses ci-dessus vous donnent une solution de chemin codé en dur. C'est mauvais à bien des niveaux (changement de version de Java, changement de système d'exploitation, etc.).

Une solution plus propre consiste à ajouter:

Java_HOME = $(Shell dirname $$(readlink -f $$(which Java))|sed 's^jre/bin^^')

près du sommet de votre fichier make, puis ajoutez:

-I$(Java_HOME)/include

Pour votre inclure des drapeaux.

Je publie ce message parce que j'ai rencontré le même problème et passé trop de temps à chercher des réponses erronées sur Google (je construis une application sur plusieurs plates-formes, l'environnement de construction doit donc être transportable).

0
GrueMaster