使用 -h 选项时的 javac "no source files"

javac "no source files" when using -h option

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

public class NativeTest {

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

    private native void sayHello();

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

我编译class,然后用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(以及其他变体,如 NativeTestNativeTest.class 等)时,我不断收到此错误:

javac: no source files

我没能在网上找到任何帮助,可能是因为这个功能比较新,我在手册页中找不到关于这个新 -h 选项的任何信息。

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

在 Java 8 中,您必须执行生成 class 文件的中间步骤才能获得 C headers

假设您有以下结构

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

在 Java 中(在 JDK 9 之前)您必须编译 class 并使用 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

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

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

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

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

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

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