44

命令:

javah -jni JavaHowTo

结果:

error: cannot access JavaHowTo 
class file for JavaHowTo not found

javadoc: error - Class JavaHowTo not found.
Error: No classes were specified on the command line.  Try -help.

我已经正确设置了类路径,但我仍然收到此javah错误。

对此的任何解决方案都会很有帮助。

4

14 回答 14

82

尝试

javah -jni com.example.JavaHowTo

com.example你的包裹在哪里。

您还需要从包含的目录运行 javahcom/example/JavaHowTo.class

例如,如果您的结构是

/home/user/com/example/JavaHowTo.class

从运行 javah

/home/user
于 2009-06-12T12:05:21.410 回答
13

以下对我有用(Win7):

javah -classpath bin/classes -jni -d jni com.my.javaclass

我从应用程序主目录运行它。

问题出在子目录类中

于 2012-04-01T15:04:04.440 回答
11

我每天都通过以下选项从构建脚本中成功使用 javah:

javah -d <outputdir> -classpath <classpath> <fully_qualified_class>

在哪里:

'outputdir' is the directory where to put the generated header file

'classpath' contains an absolute path to the directory containing your root package (as mentionned by Glen)

'fully_qualified_class' is the name of the class containing native methods without .class extension

-jni 选项不是必需的(默认设置)

无论如何,您应该检查您的类文件是否已生成:很惊讶您也会收到 javadoc 错误...

于 2009-06-12T13:20:48.920 回答
9

我遇到了同样的错误,使用http://www.inonit.com/cygwin/jni/helloWorld/header.html链接我能够成功生成 .h 文件。我使用了以下命令

C:\Program Files\Java\jdk1.6.0_21\bin>javah -d C:\Prachi\Android\Workspace_QP_re
structure\HelloWorld\bin\example\jni -classpath C:\Prachi\Android\Workspace_QP_r
estructure\HelloWorld\bin example.jni.HelloWorld

这里 example.jni 是我的包名,C:\Prachi\Android\Workspace_QP_re structure\是我的 Eclipse 工作区路径。

希望这可以帮助你

于 2011-06-07T08:58:37.697 回答
4

当我将目录添加到 -classpath 时,我遇到了这个问题。我认为类在 *.java 文件中;)

Javah 正在处理字节码,因此您必须将包含二进制文件的目录添加到类路径

我做了一些日食任务:

“地点”

${env_var:JAVA_HOME}\bin\javah.exe

“论据”

-verbose 
-force
-classpath ;${project_loc}\bin
-d ${project_loc}\jni 
${java_type_name}

选择文件并运行

于 2010-12-21T12:20:22.163 回答
3

就我而言,这个问题非常愚蠢。我尝试:javah com.aaa.bbb.ClassName。班级

没有“.class”我正确生成.h文件

javah com.aaa.bbb.ClassName

于 2011-12-29T09:36:48.740 回答
3

我正在使用 Eclipse。

命令语法:

javah -d <outputdir> -classpath <classpath> <fully_qualified_class>

outputdir- 生成头文件的目录。

classpath- 包含包含根包的目录的绝对路径。

fully_qualified_class.class- 包含没有扩展的本地方法的类的名称

生成以下文件:

C:\Users\John\workspace\JNITest\bin\com\canessa\john\jnitest\com_canessa_john_jnitest_CallMyCLib.h

生成的头文件内容:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_canessa_john_jnitest_CallMyCLib */

#ifndef _Included_com_canessa_john_jnitest_CallMyCLib
#define _Included_com_canessa_john_jnitest_CallMyCLib
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_canessa_john_jnitest_CallMyCLib
 * Method:    helloInC
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_com_canessa_john_jnitest_CallMyCLib_helloInC
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif
于 2016-12-19T14:22:00.057 回答
2

我有类似的问题并使用了 -verbose 选项。我不得不添加一个;到类路径选项的前面。

C:\Projects\HelloWorld\src>javah -verbose -classpath c:\projects\HellowWorld\build\classes helloworld.HelloWorld
error: cannot access helloworld.HelloWorld
class file for helloworld.HelloWorld not found
javadoc: error - Class helloworld.HelloWorld not found.
[ Search Path: c:\jdk\jre\lib\resources.jar;c:\jdk\jre\lib\rt.jar;c:\jdk\jre\lib    \sunrsasign.jar;c:\jdk\jre\lib\jsse.jar;c:\jdk\jre\lib\jce.jar;c:\jdk\jre\lib\ch    arsets.jar;c:\jdk\jre\classes\c:\projects\HellowWorld\build\classes ]
Error: No classes were specified on the command line.  Try -help.

C:\Projects\HelloWorld\src>javah -verbose -classpath ;c:\projects\HellowWorld\build\classes helloworld.HelloWorld
[ Search Path: c:\jdk\jre\lib\resources.jar;c:\jdk\jre\lib\rt.jar;c:\jdk\jre\lib\sunrsasign.jar;c:\jdk\jre\lib\jsse.jar;c:\jdk\jre\lib\jce.jar;c:\jdk\jre\lib\charsets.jar;c:\jdk\jre\classes\;c:\projects\HellowWorld\build\classes ]
[Creating file helloworld_HelloWorld.h]
[search path for source files: .,c:\projects\HellowWorld\build\classes]
[search path for class files: c:\jdk\jre\lib\resources.jar,c:\jdk\jre\lib\rt.jar,c:\jdk\jre\lib\sunrsasign.jar,c:\jdk\jre\lib\jsse.jar,c:\jdk\jre\lib\jce.jar,c:\jdk\jre\lib\charsets.jar,c:\jdk\jre\classes,c:\jdk\jre\lib\ext\dnsns.jar,c:\jdk\jre\lib\ext\localedata.jar,c:\jdk\jre\lib\ext\sunjce_provider.jar,c:\jdk\jre\lib\ext\sunmscapi.jar,c:\jdk\jre\lib\ext\sunpkcs11.jar,.,c:\projects\HellowWorld\build\classes]
[loading .\helloworld\HelloWorld.class]
[loading java\lang\Object.class(java\lang:Object.class)]
[loading java\lang\Throwable.class(java\lang:Throwable.class)]
[loading java\lang\Class.class(java\lang:Class.class)]
[done in 409 ms]

没有 ;,这是搜索路径的结尾:c:\jdk\jre\classes\c:\projects\HellowWorld\build\classes

由于上面的例子,我能够做到这一点。

于 2012-04-02T15:48:44.153 回答
2

对于 Windows...

文件详情

javaFileName: HelloWorld.java
packageCode: "package com.accessibility;"
importCode: "import com.accessibility.HelloWorld;"
javaFileLocation: "S:\Accessibility\tools\src\test\java\com\accessibility\HelloWorld.java"

javaFileLocation 应该被视为有两个部分......

classpath: "S:\Accessibility\tools\src\test\java"
relativeFilePath: "com\accessibility\HelloWorld.java"

创建类文件

下面的第二行是从 Windows 命令提示符运行的。

{javacLocation} -d {ouputDirectory} {javaFileLocation}
"C:\Program Files\Java\jdk1.6.0_26\bin\javac.exe" -d "S:\Accessibility\tools\src\test\java" "S:\Accessibility\tools\src\test\java\com\accessibility\HelloWorld.java"

这创建了 HelloWorld.class 文件

classFileName: HelloWorld.class 
classFileLocation: "S:\Accessibility\tools\src\test\java\com\accessibility\HelloWorld.class"

创建头文件

下面的第二行是从 Windows 命令提示符运行的。

{javahLocation} -o {outputFile} -classpath {classpath} {importName}
"C:\Program Files\Java\jdk1.6.0_26\bin\javah.exe" -o "S:\Accessibility\tools\src\test\java\com\accessibility\HelloWorld.h" -classpath "S:\Accessibility\tools\src\test\java" com.accessibility.HelloWorld

这创建了 HelloWorld.h 文件

classFileName: HelloWorld.h
classFileLocation: "S:\Accessibility\tools\src\test\java\com\accessibility\HelloWorld.h"
于 2013-08-09T20:02:53.087 回答
1

关于 Cygwin 的问题:

javah从 Cygwin 终端无法正常工作:

$ cd /cygdrive/c/Workspace/prj/bin
$ ls com/example/JavaHotTo.class
com/example/JavaHotTo.class
$ javah com.example.JavaHowTo
Error: Could not find class file for 'com.example.JavaHowTo'.

但是使用该选项可以完美地工作-classpath .

$ javah -classpath . com.example.JavaHowTo
$ ls *.h
com_example_JavaHotTo.h

更多技巧:

  • 该选项-jni是默认的,因此它不是必需的。
  • 你可以给相对/绝对classpath
  • javah在 MS-Windows 上更喜欢 path à la C:\Workspace\prj\bin
  • 用于cygpath -w /cygdrive/c/Workspace/prj/bin转换为 MS-Windows 格式
  • 使用选项-d your/jni/headers/path将标题写入另一个目录
  • javahyour/jni/headers/path如果路径不存在则创建路径(见下文)

    $ javah -d jni/headers -classpath . com.example.JavaHowTo
    $ ls       jni\headers
    com_example_JavaHotTo.h
    $ javah -d jni\path -classpath . com.example.JavaHowTo
    $ ls       jni\path
    com_example_JavaHotTo.h
    
于 2013-01-21T16:12:28.023 回答
1

它对我有用:
对于窗口:
如果路径文件 .class:D:\workspace\JNI Demo\build\classes\jni\demo 并在 Netbeans hava 包中:jni.demo.HelloWorld.java
首先,我将 .java 文件构建到文件.class。
路径文件 .class: D:\workspace\JNI Demo\build\classes\jni\demo\HelloWorld.class
其次,我 dir D:\workspace\JNI Demo\build\classes
javah -jni jni.demo.HelloWorld
最后,在路径中创建的文件结果 .j:D:\workspace\JNI Demo\build\classes

于 2015-12-14T03:15:05.070 回答
0

通过 cmd Windows 命令行转到 Java 项目的“bin”目录。

cd "Path to the bin directory of your java project"

然后,

javah "Your Package"."Name Of Your Java Class"
于 2014-02-23T09:00:52.640 回答
0

以下为我工作......从终端转到项目路径,例如,

/home/usr/Desktop/Workspace/ProjectName/src/main/java

并点击以下命令,

javah -jni com.abc.test.callfileName (没有 .class 扩展名)

com_abc_test_className.h 文件将在以下路径/home/usr/Desktop/Workspace/ProjectName/src/main/java中创建

最后命令看起来像, [my-machine/usr] $ /home/usr/Desktop/Workspace/ProjectName/src/main/java/src/main/java>javah -jni com.abc.test.className

于 2016-03-03T09:57:52.780 回答
0
如何使用 `javah` 从`Android class` 文件生成`JNI Header` 文件(`.java` 或 `.class` 都同样有效)。
对于 Windows 上的 Eclipse 项目:
转到 src、bin 和 jni 文件夹所在的目录(因此我们可以使用 src 或 bin 和 jni 的相对路径): cd C:\Android\workspace5\AndroidImageFilter 我假设 `javah` 在你的 `PATH` 中(它类似于:`C:\Program Files\Java\jdk1.7.0_79\bin\javah.exe`): javah -classpath c:\Android\sdk\platforms\android-19\android.jar;./src/ -d ./jni cn.Ragnarok.NativeFilterFunc ^ ^ ^ ^ ^ ^ ^ ^ ^ | | | | | | | | | 你的 android:targetSdkVersion="16"----------------------------+ | | | | | | | | | | | | | | | | | | | | | | | android.jar 的路径 ---------+------------------------------------------------ ----+ | | | | | | | | | | | | | | | | | | | | | | | | 分号 (;) 重要!-------------------------------------------------- + | | | | | | | | | | 您可以使用源目录(是的,您可以!)(或 /bin/classes/ 目录)-----+ | | | | | | | | 将输出文件放在哪里(本例中为cn_Ragnarok_NativeFilterFunc.h)-----------+---+ | | | | 点 (.) 分隔的 .java 源文件的完整包名路径 WITH 文件名 --------+ | | java类的文件名-------------------------------------------- -----------------------------------------+ 对于 Windows e'g' 上的 Android Studio:^ cd C:\Android\workspace5\AndroidImageFilter\app\src\main | 和 src 的 usr java INSTEAD -------------------------------------------- --------+

有关更好的方法,请参阅http://kn-gloryo.github.io/Build_NDK_AndroidStudio_detail/

如果您有很多文件名(Java 类),您可以使用带有类列表的文件。
如果您使用的是 Linux 或 MAC-OS,请使用“:”(冒号)分隔类路径的目录,而不是使用“;”
请参阅参考http://docs.oracle.com/javase/1.5.0/docs/tooldocs/windows/javah.html

于 2017-02-08T12:32:53.570 回答