如何使jni.h被找到?


75

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

在my中Makefile,没有指定位置的说明jni.h。我在问是否可以配置某些系统参数以使jni.h(例如/usr/lib/jvm/jdk1.7.0_07/include/jni.h)的路径在编译时已知。


4
添加-I/usr/lib/jvm/jdk1.7.0_07/include到编译器标志。
hmjd 2013年

1
jni.h的路径是否有任何系统方面的配置,因此无需在每次编译时都指定编译选项。
理查德

1
可能的设置JVM_HOME环境变量,并从makefile中引用它(我认为):-I$JVM_HOME/include
hmjd 2013年

这个问题之后的下一个阶段:stackoverflow.com/questions/6804253/...
Raedwald

Answers:


46

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

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

但这取决于您的makefile。


找到jni.h不会给我任何回报。我在Ubuntu 13.04机器上安装了Java 1.7。
2013年

要推广jdb的解决方案:首先设置环境$ JAVA_HOME指向所需的jdk文件夹。然后确保在gcc调用的包含路径中包含路径$ JAVA_HOME / include。
chinnychinchin

28

它需要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必需的文件


嘿! 我在Mac上,并gcc -I/Library/Java/JavaVirtualMachines/jdk1.8.0_73.jdk/Contents/Home/include/给我以下错误:clang: error: no input files
nimeshkiranverma

18

安装OpenJDK开发套件(JDK)应该可以解决您的问题。

sudo apt-get install openjdk-X-jdk

这应该使您能够毫无问题地进行编译。


7

使用以下代码:

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

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

而且,由于下载和安装的JDK版本不同,目录名称也会有所不同,因此不会有系统范围的解决方案。如果需要自动化解决方案,请将所有命令包含在一个脚本中,然后在Terminal中运行该脚本。


该答案(尽管未投票)是此问题的正确解决方案。
user2925073 2013年

找到jni.h不会给我任何回报。我在Ubuntu 13.04机器上安装了Java 1.7。
2013年

1
我怀疑如果安装了多个jdk,这将很难解决
2014年

3

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

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

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


3

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

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

export JAVA_INCLUDE_DIR=/usr/lib64/java/include

我将build.xml用于某些较旧的项目,但对我而言这不起作用,我必须提供<arg value =“-I / opt / oracle-jdk-bin-1.8.0.152 / include” />和<arg value =“-I / opt / oracle-jdk-bin-1.8.0.152 / include / linux” />使其正常工作
kensai,

1

没有发布的解决方案对我有用。

我必须vi进入Makefile并编辑路径,以便include文件夹和OS子系统(在我的情况下-I/usr/lib/jvm/java-8-openjdk-amd64/include/linux)的路径正确。这让我跑make,并make install没有问题。


1

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

0

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

较干净的解决方案是添加:

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

在makefile顶部附近,然后添加:

-I$(JAVA_HOME)/include

给你的include标志。

我发布此消息是因为我遇到了同样的问题,并且花了太多时间在错误的答案上进行谷歌搜索(我正在多个平台上构建应用程序,因此构建环境需要可移植)。


您是说我应该添加-I$(JAVA_HOME)/include到make.sh吗?这样做给了我一个错误。
Pramod

什么错 如果按照我概述的步骤进行操作,除非没有定义JAVA_HOME,否则应该没有错误(对于不支持的Java安装可能会发生)。另外,您的默认make shell是sh还是bash吗?你需要更具体。
GrueMaster

我正在使用cmd:| 。
Pramod

cmd ??? 那是Windows。也许我应该更清楚地说,这将适用于不同的Linux操作系统。另外,最初的问题是基于Linux的,没有提到Windows。
GrueMaster '19

@Promod这不是真实的。
JohanBoulé19年

0

如果您使用的是Ubuntu:

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

-1

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.