使用-h选项时,javac“没有源文件”
我正在尝试使用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
我无法在网上找到任何帮助,可能是因为这个function相对较新,我在手册页中找不到任何关于这个新-h
选项的信息。
其他人试试这个吗? 我错过了什么?
在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 -dc -cp target recipeNo001.HelloWorld # -dc -> 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 -hc java/recipeNo001/HelloWorld.java # -hc -> create header file inside c directory
我发现的解决方案是我没有指定javac
应该放置头文件的目录。
执行javac -h . NativeTest.java
javac -h . NativeTest.java
工作。