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.


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.


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


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.


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.


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.


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

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.


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.

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


-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é


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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.