Java 如何找到jni.h?
在Ubuntu 12.04中,我安装了sun/oracle的jdk7。当Java 如何找到jni.h?,java,java-native-interface,classpath,Java,Java Native Interface,Classpath,在Ubuntu 12.04中,我安装了sun/oracle的jdk7。当找到jni.h时,它会打印多个位置 /usr/lib/jvm/java-6-openjdk-amd64/include/jni.h /usr/lib/jvm/jdk1.7.0_07/include/jni.h ... 在JDK生成的头文件中,有include,当前它会抱怨 fatal error: jni.h: No such file or directory. 在我的Makefile中,没有指定jni.h所在的位置。
找到jni.h
时,它会打印多个位置
/usr/lib/jvm/java-6-openjdk-amd64/include/jni.h
/usr/lib/jvm/jdk1.7.0_07/include/jni.h
...
在JDK生成的头文件中,有include
,当前它会抱怨
fatal error: jni.h: No such file or directory.
在我的
Makefile
中,没有指定jni.h
所在的位置。我在询问是否可以配置某些系统参数,以便在编译时知道jni.h
(比如,/usr/lib/jvm/jdk1.7.0_07/include/jni.h
)的路径。您必须告诉编译器include目录在哪里。大概是这样的:
gcc -I/usr/lib/jvm/jdk1.7.0_07/include
但这取决于生成文件。使用以下代码:
make -I/usr/lib/jvm/jdk*/include
其中jdk*是您的jdk安装的目录名(例如jdk1.7.0)
而且不会有一个系统范围的解决方案,因为下载和安装的JDK版本不同,目录名也会不同。如果您需要自动化解决方案,请在单个脚本中包含所有命令,并在终端中运行所述脚本。安装OpenJDK开发工具包(JDK)应该可以解决您的问题
sudo apt-get install openjdk-X-jdk
这将使您能够顺利编译。它需要
jni.h
和jni\u 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所需的文件。我通常这样定义JAVA_HOME变量:
export JAVA_HOME=/usr/lib/jvm/java/
其中包含了必要的include文件。当我编译很多需要的东西时,我有时会将下面的内容添加到我的.barshrc中。将JAVA\u INCLUDE\u DIR设置到jni.h所在的位置应该可以解决您的问题(设置CPPFLAGS对我不起作用) 假设它是/usr/lib64/java/include
export JAVA_INCLUDE_DIR=/usr/lib64/java/include
所有发布的解决方案都不适合我
我必须将
vi
放入我的Makefile并编辑路径,以便include
文件夹和操作系统子系统(在我的例子中,-I/usr/lib/jvm/java-8-openjdk-amd64/include/linux
)的路径是正确的。这使我可以毫无问题地运行make
和make install
。我不知道这是否适用于这种情况,但有时文件由于未知原因被删除,将其再次复制到相应的文件夹中应该可以解决问题。以上答案为您提供了一个硬编码路径解决方案。这在很多层面上都很糟糕(java版本更改、操作系统更改等)
清洁剂溶液应添加:
JAVA_HOME = $(shell dirname $$(readlink -f $$(which java))|sed 's^jre/bin^^')
在makefile顶部附近,然后添加:
-I$(JAVA_HOME)/include
包括你的旗帜
我之所以发布这篇文章,是因为我遇到了同样的问题,花了太多时间在谷歌上搜索错误的答案(我正在多个平台上构建一个应用程序,因此构建环境需要可移植)。对我来说,确保包括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.
事实上,在我的$JAVA_HOME
中没有include
文件。非常简单的补救办法:
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.
如果您在Ubuntu上:
#X表示6,7,8。。。
apt安装openjdk-X-jdk
Add-I/usr/lib/jvm/jdk1.7.0_07/include
到编译器标志。jni.h的路径是否有任何系统级配置,以便每次编译时都不需要指定编译选项。可能设置jvm_HOME
环境变量并从makefile引用它(我想):-I$JVM\u HOME/include
此问题后的下一阶段:此答案(尽管未投票)是此问题的正确解决方案。Locate jni.h不返回任何内容。我在Ubuntu13.04机器上安装了Java1.7。我怀疑如果有多个jdk安装Locate jni.h没有返回任何信息,那么这将很难失败。我在Ubuntu13.04机器上安装了Java1.7。然后确保在gcc调用的include路径中包含$JAVA_HOME/include路径!我在mac电脑上,gcc-I/Library/Java/JavaVirtualMachines/jdk1.8.0\u 73.jdk/Contents/Home/include/
给了我以下错误:clang:error:no-input file
我在一些旧项目中使用build.xml,但这对我不起作用,我必须提供并使其工作你的意思是我应该添加-I$(Java\u Home)/是否将
包含到make.sh?这样做给了我一个错误。什么错误?如果您按照我概述的步骤进行操作,就不会出现错误,除非没有定义JAVA_HOME(对于不受支持的JAVA安装可能会发生这种情况)。另外,默认的makeshell是sh还是bash?你需要更具体一点。我用的是cmd:|.cmd???那是窗户。也许我应该更清楚地说,这将适用于不同的Linux操作系统。另外,最初的问题是基于Linux的,没有提到Windows。@Promod这不可能是真的。E:找不到openjdk-X-jdk包
您应该用所需的java版本替换X。