Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javah工具错误:找不到hellojni的类文件_Java_Java Native Interface_Javah - Fatal编程技术网

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

Javah工具错误:找不到hellojni的类文件,java,java-native-interface,javah,Java,Java Native Interface,Javah,我试图在Windows7操作系统的命令行中使用javah工具创建一个头文件,但一直失败 我采用了不同的方法,甚至阅读了来自oracle的javah工具文档,但它们并没有帮助克服这个问题 我的类文件(hellojni.class)和java文件(hellojni.java)都位于D:\驱动器的根目录下 但每当我运行javah工具时,它都会给我一个错误: 找不到hellojni的类文件 我也尝试提供类路径,但没有得到任何头文件。javah-classpath path\u to\u jars\u或\

我试图在Windows7操作系统的命令行中使用javah工具创建一个头文件,但一直失败

我采用了不同的方法,甚至阅读了来自oracle的javah工具文档,但它们并没有帮助克服这个问题

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

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

找不到hellojni的类文件


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

javah-classpath path\u to\u jars\u或\u classes com.my.package.MyClass

如果使用-verbose、
javah-verbose-classpath path_to_jars_或_classes com.my.package.MyClass
运行,它将显示用于查找类的搜索路径。您可以使用它来验证是否列出了您的目录D:\

例如: 文件名为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

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

D:/A>javah-classpath。类文件名


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

我怀疑问题在于您的类有一个包,您正试图从目录中使用类文件而不是包根运行命令

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
c:\src\com\example>javac MyClass.java
c:\src\com\example>dir
C:\src\com\example目录
2015-02-23 03:17下午。
2015-02-23 03:17下午。。
2015-02-23 03:20 PM 219 MyClass.class
2015-02-23 03:17 PM 84 MyClass.java
c:\src\com\example>javah MyClass
错误:找不到“MyClass”的类文件。
c:\src\com\example>cd c:\src
c:\src>javah com.example.MyClass
c:\src>dir
C:\src目录
2015-02-23 03:18下午。
2015-02-23 03:18下午。。
2015-02-23 03:16下午3:16
2015-02-23 03:18 PM 449 com_示例_MyClass.h

成功

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

$ javah -verbose Article.HelloJNICpp
$ javah -verbose -classpath ./ Article.HelloJNICpp
[Creating file RegularFileObject[Article_HelloJNICpp.h]]
$ 
如果您使用的是eclipse: 将\u包\u TOP的-classpath路径\u追加到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
    `
我的树:`
.
├── 通用域名格式
│   └── 比亚夫
│       └── 测试
│           └── JNI.java
└── libcall.so`
结果:`
byf@byf-Ubuntu:~/code/workspace\u eclipse\u java/java\u YF/src$javah-classpath。com.byf.test.JNI
byf@byf-Ubuntu:~/code/workspace\u eclipse\u java/java\u YF/src$ls
com com_byf_test_JNI.h libcall.so
byf@byf-Ubuntu:~/code/workspace\u eclipse\u java/java\u YF/src$cat com\u byf\u test\u JNI.h
/*不要编辑此文件-它是机器生成的*/
#包括
/*类com\u byf\u test\u JNI的头*/
#如果NDEF包括在测试中
#定义包括测试的组件
#ifdef_uucplusplus
外部“C”{
#恩迪夫
/*
*类别:com_byf_test_JNI
*方法:添加
*签字:(二)一
*/
JNIEXPORT jint JNICALL Java\u com\u byf\u test\u JNI\u add
(JNIEnv*,jclass,jint,jint);
#ifdef_uucplusplus
}
#恩迪夫
#恩迪夫
`

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

javac YOUR_CLASS_FILE_NAME.java -h .

点(.)包括当前路径。这个命令只能从Java 8开始运行。

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

看起来,javac指向java11实现,但javah仍然指向java8,因为

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

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

你能添加你正在运行的确切命令吗?是的。这是d:\>javah-classpath d:\hellojnisee@hendalst的答案,如果这里有新的解决方案,谢谢Samhain的回复。根据您的回复,我尝试的命令是d:\>javah-verbose-classpath d:\hellojni。但还是犯了同样的错误。实际上,我的类文件和java文件都在“d”驱动器的根目录下,所以我想我不能像com.my.package.myclass那样。如果可能的话,请你发布准确的命令。谢谢你。我已经试过了你发帖的方式。但它仍然给了我同样的错误。如果可能的话,我也可以把截图发给你。我们是否可以检查javah在哪里查找类文件。@S.SSahota发布D:\、您的.java文件的一个小样本(主要是类声明)和javah的输出,以及-verbose。我有一些其他目录,但文件是HelloJNI.class和HelloJNI.java。java中的代码是
public类HelloJNI{static{System.loadLibrary(“hello”);}私有本机void sayHello();public static void main(String[]args){new HelloJNI().sayHello();}}
当我尝试javah-verbose HelloJNI时,我得到了相同的错误。当我尝试javah-verbose-classpath d:\hellojni时,我得到了相同的错误。@S.SSahota您的类名是hellojni,而不是hellojni。命令区分大小写。非常感谢。。。节省了我很多时间。。。因此向上投票。。。爱你的男人!!!。。。你是摇滚乐手!!!就这样!谢谢你的提示。从简单的学术设置过渡时的经典问题
$ javac -cp target/classes -h lib/ src/main/java/jni/JNIClass.java