【问题标题】:javac "no source files" when using -h optionjavac 使用 -h 选项时“无源文件”
【发布时间】:2019-03-23 14:40:38
【问题描述】:

我正在尝试使用 JNI 和 JDK 9。我有一个类 NativeTest.java,如下所示:

public class NativeTest {

    static {
        System.loadLibrary("hello");
    }

    private native void sayHello();

    public static void main(String[] args) {
        new NativeTest().sayHello();
    }
}

我编译类,然后使用javah NativeTest生成头文件。

发出javah 后,我收到以下警告:

Warning: The javah tool is planned to be removed in the next major
JDK release. The tool has been superseded by the '-h' option added
to javac in JDK 8. Users are recommended to migrate to using the
javac '-h' option; see the javac man page for more information.

我知道下一个主要的 JDK 版本还需要一段时间,但我想我现在应该开始习惯这个新选项了。

所以在尝试 javac -h NativeTest.java(以及其他变体,如 NativeTest、NativeTest.class 等)时,我不断收到此错误:

javac: no source files

我一直无法在网上找到任何帮助,可能是因为此功能相对较新,我在手册页中找不到有关此新 -h 选项的任何信息。

还有其他人尝试过吗?我错过了什么?

【问题讨论】:

  • 啊,没关系,我找到了。您需要指定放置头文件的目录。 javac -h . NativeTest.java。我会留下这个问题,以防其他人遇到同样的疏忽。
  • 您可以回答自己的问题并将其标记为已接受的答案。这将减少未回答问题的数量。

标签: java c java-native-interface header-files


【解决方案1】:

我发现的解决方案是我没有指定javac 应该放置头文件的目录。

执行javac -h . NativeTest.java 有效。

【讨论】:

  • 请注意,这只是将生成的.class 文件扔到其他地方,很可能会弄乱您的源代码树。 (至少使用 openjdk 版本 13 javac)。
【解决方案2】:

在 Java 8 中,您必须进行生成类文件以获取 C 头文件的中间步骤

假设你有以下结构

recipeNo001
├── Makefile
├── README.md
├── c
│   └── recipeNo001_HelloWorld.c
├── java
│   └── recipeNo001
│       └── HelloWorld.java
├── lib
└── target

在 Java(JDK 9 之前)中,您必须编译类并将 javah 与已编译的源代码一起使用

> export JAVA_HOME=$(/usr/libexec/java_home -v 1.8.0_11)
> ${JAVA_HOME}/bin/javac -d target java/recipeNo001/*.java
> ${JAVA_HOME}/bin/javah -d c -cp target recipeNo001.HelloWorld
# -d c       -> put generated codes inside c directory
# -cp target -> compiled classes are inside target dir

在 Java 9 中,您可以将 javac -h 与 Java 源代码一起使用

> export JAVA_HOME=$(/usr/libexec/java_home -v 9)
> ${JAVA_HOME}/bin/javac -h c java/recipeNo001/HelloWorld.java
# -h c       -> create header file inside c directory

【讨论】:

    【解决方案3】:

    javah 工具已被“javac -h”功能取代。我们应该能够只使用普通的 Java 编译器(在 Java 8+ 中带有 -h 标志)在 Java 编译步骤中输出这些文件。

    用法: -h 目录 指定放置生成的本机头文件的位置。

    当您指定此选项时,将为每个包含本地方法或具有一个或多个使用 java.lang.annotation.Native 注释注释的常量的类生成一个本地头文件。如果类是包的一部分,则编译器会将本机头文件放在反映包名称的子目录中,并根据需要创建目录。

    javac -h 目录名 NativeTest.java 即可解决问题

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-04
      • 2022-06-17
      • 1970-01-01
      相关资源
      最近更新 更多