In Ubuntu 12.04 habe ich jdk7 von sun / oracle installiert. Wenn locate jni.h
gedruckt, 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 Makefile
gibt es keine Angabe von Orten, an denen es jni.h
ist. 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.
java
java-native-interface
classpath
Richard
quelle
quelle
-I/usr/lib/jvm/jdk1.7.0_07/include
zu Compiler - Flags.JVM_HOME
Umgebungsvariable setzen und aus dem Makefile darauf verweisen ( glaube ich ):-I$JVM_HOME/include
Antworten:
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.
quelle
Es braucht beides
jni.h
undjni_md.h
Dateien. Versuchen Sie diesgcc -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
quelle
gcc -I/Library/Java/JavaVirtualMachines/jdk1.8.0_73.jdk/Contents/Home/include/
gebe mir folgenden Fehler:clang: error: no input files
Die Installation des OpenJDK Development Kit (JDK) sollte Ihr Problem beheben.
Dies sollte es Ihnen ermöglichen, problemlos zu kompilieren.
quelle
Verwenden Sie den folgenden Code:
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.
quelle
Normalerweise definiere ich meine JAVA_HOME-Variable folgendermaßen:
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.
quelle
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;
quelle
Keine der veröffentlichten Lösungen hat bei mir funktioniert.
Ich musste
vi
in mein Makefile und den Pfad so bearbeiten, dass der Pfad zuminclude
Ordner und zum Betriebssystem-Subsystem (in meinem Fall-I/usr/lib/jvm/java-8-openjdk-amd64/include/linux
) korrekt war. Das erlaubte mir , zu laufenmake
undmake install
ohne Probleme.quelle
Für mich war es einfach, die JDK-Installation einzuschließen (ich hatte nur die JRE). Meine
R CMD javareconf
Ausgabe 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
include
Datei 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
openJDK
und 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.
quelle
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:
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).
quelle
-I$(JAVA_HOME)/include
Meinst du, ich sollte zu make.sh hinzufügen ? Das hat mir einen Fehler gemacht.Falls Sie auf Ubuntu sind:
#X means 6,7,8... apt install openjdk-X-jdk
quelle
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.
quelle