Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何找到jni.h?_Java_Java Native Interface_Classpath - Fatal编程技术网

Java 如何找到jni.h?

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所在的位置。

在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/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。