2013-10-02 54 views
26

我試圖用javah工具從命令行上Windows 7操作系統創建一個頭文件,但我沒有所有的時間類文件。JAVAH工具錯誤:未能找到hellojni

我按照不同的方式,甚至讀javah工具從甲骨文的文檔,但他們並沒有幫助解決這個問題需要克服。

我的類文件(hellojni.class)和java文件(hellojni.java)都位於D:\驅動器的根目錄中。

但每當我運行javah工具它給了我一個錯誤:

could not find class file for hellojni

我試圖通過提供類路徑中,但沒有得到任何的頭文件。

+0

你可以添加你正在運行的命令是什麼? – mjk

+0

是的。它是d:\> javah -classpath d:\ hellojni –

+0

請參閱@hendalst的答案如果有人在這裏尋找新的解決方案 –

回答

7

javah -classpath path_to_jars_or_classes com.my.package.MyClass

如果用-verbose,javah -verbose -classpath path_to_jars_or_classes com.my.package.MyClass運行,它會告訴你,它正在使用以找到您的類的搜索路徑。您可以使用它來驗證您的目錄D:\是否已列出。

javah Documentation

例如: 文件名爲MyClass.java,內部類的名字是MyClass的。沒有錯誤。

C:\>more MyClass.java 
public class MyClass 
{ 
    public static void doSomething(int b) 
    { 
     return; 
    } 
} 

C:\>javac MyClass.java 

C:\>javah -classpath C:\ MyClass 

C:\>dir *.h 
Volume in drive C has no label. 
Volume Serial Number is XXXX-XXXX 

Directory of C:\ 

10/07/2013 11:46 AM    242 MyClass.h 
       1 File(s)   242 bytes 
       0 Dir(s) X bytes free 
+0

謝謝Samhain爲您的答覆。根據你的回覆,我試過的命令是** d:\> javah -verbose -classpath d:\ hellojni **。但仍然有同樣的錯誤。其實我的class文件和java文件都在'd'驅動器的根目錄下,所以我認爲我不能像** com.my.package.myclass **那樣做。如果可能的話,你可以發佈確切的命令。謝謝。 –

+0

@ S.SSahota我已經用示例更新了我的答案 – Samhain

+0

我嘗試了您發佈的方式。但它仍然給我一個相同的錯誤。如果可能的話,我也可以給你發送截圖。是否有可能我們可以檢查哪裏** javah **正在尋找類文件。 –

1

假設你的類文件是在d:/ A夾 CD命令提示符到文件夾A和運行下面的命令

d:/ A> JAVAH -classpath。 classfilename

這裏.將classpath設置爲當前目錄和javah工具應該能夠找到你的類文件。

82

我懷疑問題是你的類有一個包,你試圖從類文件而不是包根的目錄運行命令。

薩溫節的例子的作品,因爲他MyClass.java不包含包,而我懷疑你呢。

例如,假設我們有以下文件在c:\src\com\example\MyClass.java

package com.example; 

public class MyClass { 
    public native void myMethod(); 
} 

轉到命令行執行以下命令:

c:\src\com\example>javac MyClass.java 

c:\src\com\example>dir 

Directory of C:\src\com\example 

2015-02-23 03:17 PM <DIR>   . 
2015-02-23 03:17 PM <DIR>   .. 
2015-02-23 03:20 PM    219 MyClass.class 
2015-02-23 03:17 PM    84 MyClass.java 

c:\src\com\example>javah MyClass 
Error: Could not find class file for 'MyClass'. 

c:\src\com\example>cd c:\src 

c:\src>javah com.example.MyClass 

c:\src>dir 
Directory of C:\src 

2015-02-23 03:18 PM <DIR>   . 
2015-02-23 03:18 PM <DIR>   .. 
2015-02-23 03:16 PM <DIR>   com 
2015-02-23 03:18 PM    449 com_example_MyClass.h 

成功!

+7

非常感謝...救了我很多小時...因此upvote ...愛你的男人!!! ...你的搖滾男人!!! –

+0

就是這樣!謝謝你的提示。從簡單的學術設置過渡到直接測試JNI的問題,以及將其整合到實際產品中的問題,其中包裹和東西突然變得很重要 – hiergiltdiestfu

+0

非常感謝你 –

1

在MacOS X,它所需的類路徑變量。這可能是解決方案,如果它可以在其他平臺上驗證。

$ javah -verbose Article.HelloJNICpp 
$ javah -verbose -classpath ./ Article.HelloJNICpp 
[Creating file RegularFileObject[Article_HelloJNICpp.h]] 
$ 
0

如果你使用eclipse: 追加-classpath PATH_OF_PACKAGE_TOP到JAVAH CLASSNAME

例子:javah -classpath . com.byf.test.JNI

my tree : ` 
. 
├── com 
│   └── byf 
│    └── test 
│     └── JNI.java 
└── libcall.so` 


result:` 
    [email protected]:~/code/workspace_eclipse_java/JAVA_YF/src$ javah -classpath . com.byf.test.JNI 
    [email protected]:~/code/workspace_eclipse_java/JAVA_YF/src$ ls 
    com com_byf_test_JNI.h libcall.so 
    [email protected]:~/code/workspace_eclipse_java/JAVA_YF/src$ cat com_byf_test_JNI.h 
    /* DO NOT EDIT THIS FILE - it is machine generated */ 
    #include <jni.h> 
    /* Header for class com_byf_test_JNI */ 

    #ifndef _Included_com_byf_test_JNI 
    #define _Included_com_byf_test_JNI 
    #ifdef __cplusplus 
    extern "C" { 
    #endif 
    /* 
    * Class:  com_byf_test_JNI 
    * Method: add 
    * Signature: (II)I 
    */ 
    JNIEXPORT jint JNICALL Java_com_byf_test_JNI_add 
     (JNIEnv *, jclass, jint, jint); 

    #ifdef __cplusplus 
    } 
    #endif 
    #endif 
    `