【问题标题】:how to make jni.h be found?如何找到 jni.h?
【发布时间】:2013-01-25 20:19:47
【问题描述】:

在 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)的路径。

【问题讨论】:

  • -I/usr/lib/jvm/jdk1.7.0_07/include 添加到编译器标志。
  • jni.h的路径是否有系统配置,所以每次编译都不需要指定编译选项。
  • 可能设置JVM_HOME环境变量并从makefile中引用它(我认为):-I$JVM_HOME/include
  • 这个问题之后的下一阶段:stackoverflow.com/questions/6804253/…

标签: java java-native-interface classpath


【解决方案1】:

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

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

但这取决于你的makefile。

【讨论】:

  • Locate jni.h 什么也没给我。我在 Ubuntu 13.04 机器上安装了 java 1.7。
  • 概括jdb的解决方案:首先设置一个环境$JAVA_HOME指向你想要的jdk文件夹。然后确保在 gcc 调用的包含路径中包含路径 $JAVA_HOME/include。
【解决方案2】:

它需要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
【解决方案3】:

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

sudo apt-get install openjdk-X-jdk

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

【讨论】:

  • E: Unable to locate package openjdk-X-jdk
  • 你应该用你需要的java版本替换X。
【解决方案4】:

使用以下代码:

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

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

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

【讨论】:

  • 这个答案(虽然没有投票)是这个问题的正确解决方案。
  • Locate jni.h 什么也没给我。我在 Ubuntu 13.04 机器上安装了 java 1.7。
  • 我怀疑如果有多个 jdk 安装,这将很难失败
  • 在 Fedora 上,区域设置为 jni.h,输入 sudo dnf repoquery --installed -l java-latest-openjdk-devel
【解决方案5】:

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

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

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

【讨论】:

    【解决方案6】:

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

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

    export JAVA_INCLUDE_DIR=/usr/lib64/java/include
    

    【讨论】:

    • 我将 build.xml 用于一些较旧的项目,但这对我不起作用,我必须提供 使其工作
    【解决方案7】:

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

    【讨论】:

      【解决方案8】:

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

      我必须将vi 添加到我的 Makefile 中并编辑路径,以便include 文件夹和操作系统子系统(在我的情况下为-I/usr/lib/jvm/java-8-openjdk-amd64/include/linux)的路径是正确的。这让我可以毫无问题地运行 makemake install

      【讨论】:

        【解决方案9】:

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

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

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

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

        -I$(JAVA_HOME)/include
        

        到您的包含标志。

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

        【讨论】:

        • 你的意思是我应该将-I$(JAVA_HOME)/include 添加到make.sh 中吗?这样做给了我一个错误。
        • 什么错误?如果您按照我概述的步骤进行操作,则应该不会出现错误,除非未定义 JAVA_HOME(这可能发生在不支持的 java 安装中)。另外,您的默认 make shell 是 sh 还是 bash?你需要更具体。
        • 我使用的是 cmd :| .
        • cmd???那是窗户。也许我应该更清楚地说这将适用于不同的 Linux 操作系统。另外,最初的问题是基于 Linux 的,没有提到 Windows。
        • @Promod 这不可能是真的。
        【解决方案10】:

        如果您使用的是 Ubuntu:

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

        【讨论】:

          【解决方案11】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2019-11-28
            • 1970-01-01
            • 2017-07-22
            • 2018-05-13
            • 1970-01-01
            • 2016-04-15
            • 1970-01-01
            • 2015-02-14
            相关资源
            最近更新 更多