使用 -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
(以及其他变体,如 NativeTest
、NativeTest.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 会解决问题
我正在尝试使用 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
(以及其他变体,如 NativeTest
、NativeTest.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 会解决问题