2017-10-05 2143 views
0

我試圖使用JNI的實驗和JDK 9時,我有一個類NativeTest.java,看起來像這樣:javac的「無源文件」使用-h選項

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(和其他變化一樣NativeTestNativeTest.class等),我不斷收到此錯誤:

javac: no source files

我一直沒能在網上找到的任何幫助,可能是因爲此功能相對較新,在手冊頁中我找不到關於這個新-h選項的任何信息。

其他人試過這個嗎?我錯過了什麼?

+0

啊,沒關係,我找到了。您需要指定放置頭文件的目錄。 'javac -h。 NativeTest.java'。如果其他人遇到同樣的疏忽,我會留下問題。 –

+0

您可以回答自己的問題並將其標記爲接受的答案。這將減少未解答問題的數量。 – cup

回答

0

我發現的解決方案是我沒有指定javac應該放置頭文件的目錄。

執行javac -h . NativeTest.java工作。

0

我不知道,但似乎你從你正在執行javac命令你的當前文件夾和你的java文件NativeTest.java存在不在你的系統路徑或類路徑。只要嘗試先不使用-h選項進行編譯即可。如果未設置類路徑,則可能會出現相同的錯誤。

1

在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