0

我已经研究了几个与这个问题类似的例子,但我还没有找到一个可以解决我的问题的例子。我只是想用原生方法来做我的第一个程序。我没有将程序存储在包的层次结构中,因为我试图在我的第一个示例中使其尽可能简单。以下是所有内容的存储方式:

我有一门课叫做 NativeDemo。它存储在 C:/JavaFiles/demo/ 中。我编译了程序,.class 文件存储在同一个文件夹中。当我尝试在该程序上调用 javah 命令时,它告诉我找不到类文件。你能告诉我我做错了什么吗?

我的javah命令存储在我的JDK中,存储方式如下:C:/jdk1.0.7_04/bin/

在命令提示符的命令行中,我键入:

C:\JavaFiles\demo>C:\jdk1.7.0_04\bin\javah -jni NativeDemo 也试过 C:\JavaFiles\demo>C:\jdk1.7.0_04\bin\javah.exe -jni NativeDemo

当我这样做时,它告诉我找不到类文件。这与编译时使用的路径相同,它找到了文件,编译并创建了 .class 文件,没有任何问题。

请帮忙。谢谢。

4

5 回答 5

5

您可能需要-classpath在命令行上提供一个参数javah来设置类路径。(-classpathfor 参数的javah行为与其他 Java 工具的行为相同;例如 java、javac、javap 等。如果您不了解类路径,请阅读此页面此页面。)

于 2012-06-30T02:27:11.977 回答
1

由于从未添加过解决方案,我想我会贡献我找到的解决方案来解决这个问题。这并不是一个真正的解决方案,因为它是 100% 的用户错误!。

在听起来类似的情况下,我想创建一个快速的小项目来演示 JNI 的使用。由于这是一个简单的练习,我没有使用 IDE,而是简单地使用 vi 编写代码并使用 javac 编译它。

例如

myclass.java(完全限定的类名是 mypackage.myclass)

javac myclass.java

上面的命令将 myclass.class 输出到当前目录。我现在的工作目录中有 myclass.java 和 myclass.class。

运行 javah mypackage.myclass 会导致所描述的错误。

这里的问题是我使用 javac,我将编译后的类写入当前目录,但是 javah 正在“/mypackage/myclass.class”中寻找它。

一个愚蠢的小问题,一个愚蠢的小答案,但我很生气今天在这上面浪费了 15 分钟,所以希望我可以拯救别人同样的痛苦(是的,我知道我应该早点发现它,如果我不只是有一个娱乐几个小时发现热点和 gnuj java 实现之间的 System.load 差异,所以遗憾的是我并不完全信任我的工具:(!!)。

于 2013-10-03T08:58:42.160 回答
0

您必须使用类的完全限定名称。javah 的语法是javah [options] classes类是用它们的完全限定名指定的。所以,在你的情况下,如果你的包是演示,那么命令是,

C:\JavaFiles\demo>C:\jdk1.7.0_04\bin\javah -classpath . demo.NativeDemo

类路径是 . 因为,正如您提到的,您在当前目录中有 .class 文件。并且 -jni 选项不是必需的,因为它是默认的。

于 2013-12-04T13:36:33.197 回答
0

在 android studio 1.5 中我遇到了同样的问题并运行了上面的命令但什么也没有,我探索了 app 模块构建文件夹,并且中间文件夹中没有 classes 文件夹,所以在运行命令创建项目之前,你可以通过 Build>Make Project 或快捷键Ctrl+ F9,然后运行上面的命令

于 2016-03-22T18:44:58.587 回答
-1

我用eclipse项目目录中使用的以下命令解决了这个问题:

javah -classpath [PROJECT_DIR\bin\classes] class.name
于 2015-04-10T13:21:06.783 回答