在JNI中使用它时出现Javah错误

时间:2009-06-12 11:58:08

标签: java java-native-interface classpath

命令:

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错误。

任何解决方案都会有所帮助。

14 个答案:

答案 0 :(得分:81)

尝试

javah -jni com.example.JavaHowTo

其中com.example是你的包裹。

您还需要从包含com/example/JavaHowTo.class

的目录运行javah

e.g。如果您的结构是

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

运行javah
/home/user

答案 1 :(得分:13)

以下为我工作(Win7):

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

我是从app主目录运行的。

问题出在子目录

答案 2 :(得分: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错误......

答案 3 :(得分: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工作空间路径。

希望这有助于你

答案 4 :(得分:4)

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

Javah正在处理字节代码,所以你必须将带有二进制文件的目录添加到类路径

我做了一些日食任务:

“位置”

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

“参数”

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

选择文件并运行

答案 5 :(得分:3)

在我的情况下,问题非常愚蠢.. 我尝试: javah com.aaa.bbb.ClassName。 class

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

javah com.aaa.bbb.ClassName

答案 6 :(得分: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 \类\ C:\项目\ HellowWorld \建立\类

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

答案 7 :(得分: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"

答案 8 :(得分:2)

我正在使用Eclipse。

命令语法:

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

outputdir - 生成头文件的目录。

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

fully_qualified_class - 包含没有.class扩展名

的原生方法的类的名称

生成以下文件:

  

C:\用户\约翰\工作空间\ JNITest \ BIN \ COM \ canessa \约翰\ 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

答案 9 :(得分: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
  • 但MS-Windows上的javah更喜欢路径àla C:\Workspace\prj\bin
  • 使用cygpath -w /cygdrive/c/Workspace/prj/bin转换为MS-Windows格式
  • 使用选项-d your/jni/headers/path在另一个目录中编写标题
  • javah创建路径your/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
    

答案 10 :(得分: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

答案 11 :(得分:0)

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

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

然后,

javah "Your Package"."Name Of Your Java Class"

答案 12 :(得分: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&gt; javah -jni com.abc.test.className

答案 13 :(得分:0)

How to generate a `JNI Header` file from an `Android class` file using `javah` (`.java` or `.class` BOTH work equally well).
For Eclipse project on Windows:
Goto the directory where the src, bin and jni folders are (so we can use relative paths to src or bin and jni): cd C:\Android\workspace5\AndroidImageFilter I assume `javah` is in your `PATH` (It is in something like : `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 ^ ^ ^ ^ ^ ^ ^ ^ ^ | | | | | | | | | Your android:targetSdkVersion="16"----------------------------+ | | | | | | | | | | | | | | | | | | | | | | | path to android.jar ---------+---------------------------------------+ | | | | | | | | | | | | | | | | | | | | | | | | semicolon (;) important ! --------------------------------------------------+ | | | | | | | | | | You can use the source directory (yes you can !) (OR the /bin/classes/ dir)-----+ | | | | | | | | Where to put the output file (cn_Ragnarok_NativeFilterFunc.h in this case)-----------+---+ | | | | The dot (.) spearated full package name path to the .java source file WITH file name --------+ | | File name of a java class -------------------------------------------------------------------------------------+ For Android Studio on Windows e'g': ^ cd C:\Android\workspace5\AndroidImageFilter\app\src\main | and usr java INSTEAD of src ----------------------------------------------------+

有关更好的方法,请参阅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