在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
)的路径。
答案 0 :(得分:32)
您必须告诉编译器include目录在哪里。像这样:
gcc -I/usr/lib/jvm/jdk1.7.0_07/include
但这取决于你的makefile。
答案 1 :(得分:20)
它需要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
所需的文件答案 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
)的路径是正确的。这使我可以毫无问题地运行make
和make 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)
我不知道这种情况是否适用,但是有时由于未知原因删除了文件,将其再次复制到相应的文件夹中可以解决问题。