81

在 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

4

11 回答 11

48

你必须告诉你的编译器包含目录在哪里。像这样的东西:

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

但这取决于您的makefile。

于 2013-01-25T20:25:16.910 回答
30

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

于 2015-04-10T12:59:57.513 回答
17

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

sudo apt-get install openjdk-X-jdk

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

于 2015-02-13T08:33:27.660 回答
8

使用以下代码:

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

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

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

于 2013-10-27T12:53:01.820 回答
8

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

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

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

于 2015-07-03T18:37:36.560 回答
4

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

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

export JAVA_INCLUDE_DIR=/usr/lib64/java/include
于 2017-08-24T21:27:35.877 回答
3

对我来说,确保包含 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.
于 2019-03-25T08:03:40.600 回答
1

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

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

于 2018-02-27T07:34:14.760 回答
1

以上答案为您提供了硬编码路径解决方案。这在很多层面上都很糟糕(java 版本更改、操作系统更改等)。

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

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

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

-I$(JAVA_HOME)/include

到您的包含标志。

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

于 2019-03-15T22:25:27.327 回答
1

如果你在 Ubuntu 上:

#X means 6,7,8...
apt install openjdk-X-jdk
于 2020-05-28T08:28:12.657 回答
-1

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

于 2018-11-13T23:08:41.947 回答