Как найти jni.h?
В Ubuntu 12.04 у меня установлен jdk7 от sun/oracle. когда locate jni.h
, он печатает несколько мест
/usr/lib/jvm/java-6-openjdk-amd64/include/jni.h
/usr/lib/jvm/jdk1.7.0_07/include/jni.h
...
В заголовочном файле, сгенерированном JDK, есть include <jni.h>
и сейчас жалуется
fatal error: jni.h: No such file or directory.
В моем Makefile
нет указания мест где jni.h
является. И я прошу, если возможно, настроить определенный параметр системы, чтобы сделать путь jni.h
(сказать, /usr/lib/jvm/jdk1.7.0_07/include/jni.h
) быть известным при компиляции.
8 ответов
Вы должны сообщить своему компилятору, где находится каталог include. Что-то вроде этого:
gcc -I/usr/lib/jvm/jdk1.7.0_07/include
Но это зависит от вашего make-файла.
Это нужно как jni.h
а также jni_md.h
файлы, попробуйте это
gcc -I/usr/lib/jvm/jdk1.7.0_07/include \
-I/usr/lib/jvm/jdk1.7.0_07/include/linux filename.c
Это будет включать в себя как широкие файлы JNI, так и те, которые необходимы для Linux
Установка OpenJDK Development Kit (JDK) должна исправить вашу проблему.
sudo apt-get install openjdk-X-jdk
Это должно позволить вам собрать без проблем.
Я обычно определяю свою переменную JAVA_HOME следующим образом:
export JAVA_HOME=/usr/lib/jvm/java/
В нем есть необходимые файлы включения. Иногда я добавляю ниже к моему.barshrc, когда я собираю много вещей, которые в этом нуждаются.
Используйте следующий код:
make -I/usr/lib/jvm/jdk*/include
где jdk* - это имя каталога вашей установки jdk (например, jdk1.7.0).
И не было бы общесистемного решения, так как имя каталога было бы другим с различными сборками JDK, загруженными и установленными. Если вы хотите автоматизированное решение, пожалуйста, включите все команды в один скрипт и запустите указанный скрипт в Терминале.
Для меня это был простой вопрос - обязательно установить JDK (у меня был только JRE). мой R CMD javareconf
вывод был похож на:
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.
И действительно не было include
файл в моем $JAVA_HOME
, Очень простое средство:
sudo apt-get install openjdk-8-jre openjdk-8-jdk
(обратите внимание, что это специально предназначено для установки openJDK
а не тот от Oracle)
Потом все хорошо
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.
Установка JAVA_INCLUDE_DIR в том месте, где находится jni.h, должна решить вашу проблему (настройка CPPFLAGS у меня не сработала)
Предполагая, что это /usr/lib64/java/include;
export JAVA_INCLUDE_DIR=/usr/lib64/java/include
Приведенные выше ответы дают вам жестко заданное решение. Это плохо на многих уровнях (изменение версии Java, изменение ОС и т. Д.).
Более чистым решением является добавление:
JAVA_HOME = $(shell dirname $$(readlink -f $$(which java))|sed 's^jre/bin^^')
в верхней части вашего make-файла, затем добавьте:
-I$(JAVA_HOME)/include
Чтобы вы включили флаги.
Я публикую это, потому что столкнулся с той же проблемой и потратил слишком много времени на поиск неправильных ответов (я создаю приложение на нескольких платформах, поэтому среда сборки должна быть переносимой).
Если вы используете Ubuntu:
#X means 6,7,8...
apt install openjdk-X-jdk
Ни одно из опубликованных решений не сработало для меня.
Мне пришлось vi
в мой Makefile и отредактируйте путь так, чтобы путь к include
папка и подсистема ОС (в моем случае, -I/usr/lib/jvm/java-8-openjdk-amd64/include/linux
) было правильно. Это позволило мне бежать make
а также make install
без проблем.
Я не знаю, применимо ли это в этом случае, но иногда файл по неизвестным причинам удалялся, и его повторное копирование в соответствующую папку должно решить проблему.