Wie kann man jni.h finden?

74

In Ubuntu 12.04 habe ich jdk7 von sun / oracle installiert. Wenn locate jni.hgedruckt, werden mehrere Speicherorte gedruckt

/usr/lib/jvm/java-6-openjdk-amd64/include/jni.h
/usr/lib/jvm/jdk1.7.0_07/include/jni.h
...

In der von JDK generierten Header-Datei gibt es include <jni.h>und derzeit beschwert es sich

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

In meinem Makefilegibt es keine Angabe von Orten, an denen es jni.hist. Und ich frage, ob es möglich ist, bestimmte Systemparameter so zu konfigurieren, dass der Pfad von jni.h(sagen wir /usr/lib/jvm/jdk1.7.0_07/include/jni.h) beim Kompilieren bekannt wird.

Richard
quelle
4
In -I/usr/lib/jvm/jdk1.7.0_07/includezu Compiler - Flags.
hmjd
1
Gibt es eine systembezogene Konfiguration für den Pfad von jni.h, sodass nicht jedes Mal, wenn er kompiliert wird, eine Kompilierungsoption angegeben werden muss?
Richard
1
Mögliche JVM_HOMEUmgebungsvariable setzen und aus dem Makefile darauf verweisen ( glaube ich ):-I$JVM_HOME/include
hmjd
Die nächste Stufe nach dieser Frage: stackoverflow.com/questions/6804253/…
Raedwald

Antworten:

46

Sie müssen Ihrem Compiler mitteilen, wo sich das Include-Verzeichnis befindet. Etwas wie das:

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

Aber es hängt von deinem Makefile ab.

jdb
quelle
Locate jni.h gibt mir nichts zurück. Ich habe Java 1.7 auf Ubuntu 13.04 installiert.
w2lame
So verallgemeinern Sie die Lösung von jdb: Legen Sie zunächst eine Umgebung $ JAVA_HOME fest, die auf den gewünschten jdk-Ordner verweist. Stellen Sie dann sicher, dass Sie den Pfad $ JAVA_HOME / include in Ihre Include-Pfade für den gcc-Aufruf aufnehmen.
Chinnychinchin
28

Es braucht beides jni.hund jni_md.hDateien. Versuchen Sie dies

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

Dies umfasst sowohl die breiten JNI-Dateien als auch die für Linux erforderlichen

Yogesh Singh
quelle
Hallo! Ich bin auf dem Mac und gcc -I/Library/Java/JavaVirtualMachines/jdk1.8.0_73.jdk/Contents/Home/include/gebe mir folgenden Fehler:clang: error: no input files
Nimeshkiranverma
18

Die Installation des OpenJDK Development Kit (JDK) sollte Ihr Problem beheben.

sudo apt-get install openjdk-X-jdk

Dies sollte es Ihnen ermöglichen, problemlos zu kompilieren.

hgaronfolo
quelle
7

Verwenden Sie den folgenden Code:

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

Dabei ist jdk * der Verzeichnisname Ihrer jdk-Installation (z. B. jdk1.7.0).

Und es würde keine systemweite Lösung geben, da der Verzeichnisname bei verschiedenen heruntergeladenen und installierten JDK-Builds unterschiedlich wäre. Wenn Sie eine automatisierte Lösung wünschen, fügen Sie bitte alle Befehle in ein einziges Skript ein und führen Sie das Skript in Terminal aus.

user2925073
quelle
Diese Antwort (obwohl nicht abgestimmt) ist die richtige Lösung für diese Frage.
user2925073
Locate jni.h gibt mir nichts zurück. Ich habe Java 1.7 auf Ubuntu 13.04 installiert.
w2lame
1
Ich vermute, dass dies schwer scheitern wird, wenn es mehr als eine JDK-Installation gibt
Dequis
3

Normalerweise definiere ich meine JAVA_HOME-Variable folgendermaßen:

export JAVA_HOME=/usr/lib/jvm/java/

Darin befinden sich die notwendigen Include-Dateien. Ich füge manchmal das Folgende zu meiner .barshrc hinzu, wenn ich viele Dinge kompiliere, die es brauchen.

Leo Ufimtsev
quelle
3

Das Setzen von JAVA_INCLUDE_DIR auf jni.h sollte Ihr Problem lösen (das Setzen von CPPFLAGS hat bei mir nicht funktioniert)

Angenommen, es ist / usr / lib64 / java / include;

export JAVA_INCLUDE_DIR=/usr/lib64/java/include
Karanis
quelle
Ich verwende build.xml für ein älteres Projekt und dies hat bei mir nicht funktioniert. Ich musste <arg value = "- I / opt / oracle-jdk-bin-1.8.0.152 / include" /> und <arg value angeben = "- I / opt / oracle-jdk-bin-1.8.0.152 / include / linux" /> damit es funktioniert
kensai
1

Keine der veröffentlichten Lösungen hat bei mir funktioniert.

Ich musste viin mein Makefile und den Pfad so bearbeiten, dass der Pfad zum includeOrdner und zum Betriebssystem-Subsystem (in meinem Fall -I/usr/lib/jvm/java-8-openjdk-amd64/include/linux) korrekt war. Das erlaubte mir , zu laufen makeund make installohne Probleme.

vphilipnyc
quelle
1

Für mich war es einfach, die JDK-Installation einzuschließen (ich hatte nur die JRE). Meine R CMD javareconfAusgabe sah aus wie:

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.

Und tatsächlich war keine includeDatei in meiner $JAVA_HOME. Sehr einfaches Mittel:

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

(Beachten Sie, dass dies speziell für die Installation von openJDKund nicht von Oracle vorgesehen ist.)

Danach ist alles in Ordnung:

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.
MichaelChirico
quelle
0

Die obigen Antworten geben Ihnen eine fest codierte Pfadlösung. Dies ist auf so vielen Ebenen schlecht (Änderung der Java-Version, Änderung des Betriebssystems usw.).

Eine sauberere Lösung besteht darin, Folgendes hinzuzufügen:

JAVA_HOME = $(shell dirname $$(readlink -f $$(which java))|sed 's^jre/bin^^')

Fügen Sie dann oben in Ihrem Makefile Folgendes hinzu:

-I$(JAVA_HOME)/include

Zu Ihren Include-Flags.

Ich poste dies, weil ich auf dasselbe Problem gestoßen bin und zu viel Zeit damit verbracht habe, nach falschen Antworten zu googeln (ich erstelle eine App auf mehreren Plattformen, daher muss die Build-Umgebung transportabel sein).

GrueMaster
quelle
-I$(JAVA_HOME)/includeMeinst du, ich sollte zu make.sh hinzufügen ? Das hat mir einen Fehler gemacht.
Pramod
Welcher Fehler? Wenn Sie die von mir beschriebenen Schritte ausführen, sollte kein Fehler auftreten, es sei denn, JAVA_HOME ist nicht definiert (was bei einer nicht unterstützten Java-Installation der Fall sein kann). Ist Ihre Standardeinstellung make shell sh oder bash? Sie müssen genauer sein.
GrueMaster
Ich habe cmd verwendet: | .
Pramod
cmd ??? Das ist Windows. Vielleicht sollte ich klarer sein und sagen, dass dies mit verschiedenen Linux- Betriebssystemen funktioniert. Außerdem war die ursprüngliche Frage Linux-basiert, ohne Windows zu erwähnen.
GrueMaster
@Promod Das kann nicht echt sein.
Johan Boulé
0

Falls Sie auf Ubuntu sind:

#X means 6,7,8...
apt install openjdk-X-jdk
Edelsteinfeld
quelle
-1

Ich weiß nicht, ob dies in diesem Fall zutrifft, aber manchmal wurde die Datei aus unbekannten Gründen gelöscht. Wenn Sie sie erneut in den entsprechenden Ordner kopieren, sollte das Problem behoben sein.

el científico
quelle