如何找到jni.h?

时间:2013-01-25 20:19:47

标签: java java-native-interface classpath

在Ubuntu 12.04中,我安装了sun / oracle的jdk7。当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)的路径。

11 个答案:

答案 0 :(得分:32)

您必须告诉编译器include目录在哪里。像这样:

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

但这取决于你的makefile。

答案 1 :(得分:20)

它需要jni.hjni_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

所需的文件

答案 2 :(得分:13)

安装OpenJDK开发工具包(JDK)应该可以解决您的问题。

sudo apt-get install openjdk-X-jdk

这应该可以让你编译没有问题。

答案 3 :(得分:6)

使用以下代码:

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

其中jdk *是jdk安装的目录名(例如jdk1.7.0)。

并且没有系统范围的解决方案,因为目录名称与下载和安装的不同JDK版本不同。如果您需要自动化解决方案,请在单个脚本中包含所有命令,并在终端中运行所述脚本。

答案 4 :(得分:2)

我通常像这样定义我的JAVA_HOME变量:

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

其中包含必要的包含文件。当我编译很多需要它的东西时,我有时会将下面的内容添加到我的.barshrc中。

答案 5 :(得分:2)

将JAVA_INCLUDE_DIR设置为jni.h所在的位置可以解决您的问题(设置CPPFLAGS对我不起作用)

假设它是/ usr / lib64 / java / include;

export JAVA_INCLUDE_DIR=/usr/lib64/java/include

答案 6 :(得分:1)

所有发布的解决方案都不适合我。

我必须vi进入我的Makefile并编辑路径,以便include文件夹和OS子系统(在我的情况下,-I/usr/lib/jvm/java-8-openjdk-amd64/include/linux)的路径是正确的。这使我可以毫无问题地运行makemake install

答案 7 :(得分:0)

以上答案为您提供了硬编码的路径解决方案。在许多级别(Java版本更改,操作系统更改等)上,这都是不好的。

更清洁的解决方案是添加:

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

在制作文件顶部附近,然后添加:

-I$(JAVA_HOME)/include

显示您的包含标志。

我之所以发布此帖子,是因为我遇到了同样的问题,并花了太多时间来寻找错误的答案(我正在多个平台上构建应用程序,因此构建环境需要可移植)。

答案 8 :(得分:0)

对我来说,确保包含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.

答案 9 :(得分:0)

如果您使用的是Ubuntu:

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

答案 10 :(得分:-1)

我不知道这种情况是否适用,但是有时由于未知原因删除了文件,将其再次复制到相应的文件夹中可以解决问题。