我正在尝试从 Windows 7 OS 的命令行使用 javah 工具创建一个头文件,但我一直都失败了。
我遵循了不同的方法,甚至从 oracle 阅读了 javah 工具的文档,但它们无助于克服这个问题。
我的类文件 ( hellojni.class
) 和 java 文件 ( hellojni.java
) 都在D:\
驱动器的根目录中。
但是每当我运行 javah 工具时,它都会给我一个错误:
找不到 hellojni 的类文件
我也尝试提供类路径,但没有获得任何头文件。
我正在尝试从 Windows 7 OS 的命令行使用 javah 工具创建一个头文件,但我一直都失败了。
我遵循了不同的方法,甚至从 oracle 阅读了 javah 工具的文档,但它们无助于克服这个问题。
我的类文件 ( hellojni.class
) 和 java 文件 ( hellojni.java
) 都在D:\
驱动器的根目录中。
但是每当我运行 javah 工具时,它都会给我一个错误:
找不到 hellojni 的类文件
我也尝试提供类路径,但没有获得任何头文件。
我怀疑问题是您的类有一个包,并且您试图从包含类文件的目录而不是包 root 运行命令。
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/C++ 标头以实现 Java 本机接口 (JNI) 时,我也遇到了同样的问题(我怀疑这是您试图从文件名中执行的操作)。为我解决的问题是使用以下命令将两个步骤合并为一个:
javac YOUR_CLASS_FILE_NAME.java -h .
点 (.) 包括当前路径。此命令只能从 Java 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 文档
示例:文件名为 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
我在安装了 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 不再包含在 Java 11 中。
Java 11 的解决方案是使用 javac 并请求它生成头文件:
$ javac -cp target/classes -h lib/ src/main/java/jni/JNIClass.java
假设你的类文件在 D:/A 文件夹中 cd 你的命令提示符到文件夹 A 并运行下面的命令
D:/A>javah -classpath 。类文件名
这里.
将类路径设置为当前目录,javah 工具应该能够找到您的类文件。
如果您使用的是 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
`
在 MacOS X 上,它需要类路径变量。如果它也可以在其他平台上验证,这可能是解决方案。
$ javah -verbose Article.HelloJNICpp
$ javah -verbose -classpath ./ Article.HelloJNICpp
[Creating file RegularFileObject[Article_HelloJNICpp.h]]
$