Как найти 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 без проблем.

Я не знаю, применимо ли это в этом случае, но иногда файл по неизвестным причинам удалялся, и его повторное копирование в соответствующую папку должно решить проблему.

Другие вопросы по тегам