Javah工具错误:无法找到hellojni的类文件

时间:2013-10-02 12:44:21

标签: java java-native-interface javah

我试图在Windows 7操作系统上从命令行使用javah工具创建头文件,但我一直都失败了。

我已经采用了不同的方式,甚至从oracle阅读了javah工具的文档,但是他们没有帮助克服这个问题。

我的类文件(hellojni.class)和java文件(hellojni.java)都位于D:\驱动器的根目录中。

但每当我运行javah工具时,它都会给我一个错误:

  

找不到hellojni的类文件

我尝试提供类路径,但没有得到任何头文件。

7 个答案:

答案 0 :(得分:101)

我怀疑问题是你的类有一个包,你试图从包含类文件的目录而不是包根运行命令。

Samhain的例子有效,因为他的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

成功!

答案 1 :(得分:8)

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

答案 2 :(得分:1)

假设您的类文件位于D:/ A文件夹中 将命令提示符cd到文件夹A并在命令

下运行

D:/ A&gt; javah -classpath。 classfilename

此处.会将类路径设置为当前目录,javah工具应该能够找到您的类文件。

答案 3 :(得分:1)

在MacOS X上,它需要classpath变量。如果可以在其他平台上验证,这可能是解决方案。

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

答案 4 :(得分:1)

如果您正在使用eclipse: 将-classpath PATH_OF_PACKAGE_TOP附加到javah CLASSNAME

实施例:javah -classpath . com.byf.test.JNI

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


result:`
    byf@byf-Ubuntu:~/code/workspace_eclipse_java/JAVA_YF/src$ javah -classpath . com.byf.test.JNI
    byf@byf-Ubuntu:~/code/workspace_eclipse_java/JAVA_YF/src$ ls
    com  com_byf_test_JNI.h  libcall.so
    byf@byf-Ubuntu:~/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
    `

答案 5 :(得分:1)

在尝试为Java本机接口(JNI)实现分两个步骤编译和生成C / C ++头时,我也遇到了相同的问题(我怀疑这是您尝试通过文件名执行的操作)。为我解决的是使用以下命令将两个步骤合并为一个步骤:

javac YOUR_CLASS_FILE_NAME.java -h .

点(。)包含当前路径。此命令只能从Java 8开始运行。

答案 6 :(得分:0)

我在安装了 Java 8 和 Java 11(默认)的 Ubuntu 20.04 上遇到了这样的问题:

$ javac -cp target/classes -d target/classes src/main/java/jni/JNIClass.java
$ javah -cp target/classes -d lib/ jni.JNIClass
Error: Could not find class file for 'jtni.JNIClass'.

看来,javac 指向的是 Java 11 实现,但 javah 仍然指向 Java 8,因为 javah is not included in Java 11 anymore

Java 11 的解决方案是使用 javac 并请求它生成头文件:

$ javac -cp target/classes -h lib/ src/main/java/jni/JNIClass.java