在JNI中使用Javah错误

命令:

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. 

我已经正确设置了类path,但仍然得到这个javah错误。

任何解决scheme将是非常有用的。

尝试

 javah -jni com.example.JavaHowTo 

com.example是你的软件包。

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

如果你的结构是

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

运行javah

 /home/user 

以下为我工作(Win7):

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

我从应用程序的主目录运行这个。

问题出在子目录类中

我通过以下选项从构build脚本中成功使用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错误…

我遇到了同样的错误,并使用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 workspacepath。

希望这可以帮助你

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

Javah正在处理字节码,所以你必须把你的二进制文件添加到classpath中

我做了一些日食任务:

“位置”

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

“参数”

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

select文件并运行

在我的情况下,这个问题是相当愚蠢的..我尝试:javah com.aaa.bbb.ClassName。

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

javah com.aaa.bbb.ClassName

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

 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] 

没有;,这是searchpath的结尾:c:\ jdk \ jre \ classes \ c:\ projects \ HellowWorld \ build \ classes

由于上面的例子,我能够得到这么多。

对于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" 

创build类文件

下面的第二行是从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" 

这创build了HelloWorld.class文件

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

创build头文件

下面的第二行是从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 

这创build了HelloWorld.h文件

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

问题Cygwin:

从Cygwinterminaljavah不能正常工作:

 $ 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 .完美工作-classpath .

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

更多的技巧:

  • 选项-jni是默认的,因此它不是-jni
  • 你可以给相对/绝对classpath
  • 但是MS-Windows上的javah更喜欢pathC:\Workspace\prj\bin
  • 使用cygpath -w /cygdrive/c/Workspace/prj/bin转换成MS-Windows格式
  • 使用选项-d your/jni/headers/path在另一个目录中写入标题
  • javahyour/jni/headers/path不存在的情况下创buildpath(见下面)

     $ 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 

它与我合作:
对于窗口:
如果path文件.class: D:\ workspace \ JNI Demo \ build \ classes \ jni \ demo并且在Netbeans hava包中: jni.demo.HelloWorld.java
首先,我将文件.java编译到文件.class中。
path文件.class: D:\ workspace \ JNI Demo \ build \ classes \ jni \ demo \ HelloWorld.class
其次,我是D:\ workspace \ JNI Demo \ build \ classes
javah -jni jni.demo.HelloWorld
最后,在path中创build文件结果.j: D:\ workspace \ JNI Demo \ build \ classes

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

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

然后,

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

以下为我工作…从terminal转到项目path,

/家庭的/ usr /桌面/工作区/项目名/ src目录/主/ JAVA

并命中下面的命令,

javah -jni com.abc.test.callfileName (不带.class扩展名)

com_abc_test_className.h文件将在以下path中创build/ 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

我正在使用Eclipse。

命令语法:

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

outputdir – 生成头文件的目录。

classpath – 包含包含根包的目录的绝对path。

fully_qualified_class – 包含本机方法WITHOUT .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 
如何使用`javah`(`.java`或`.class`)来从`Android class`文件中生成一个`JNI Header`文件。 
对于Windows上的Eclipse项目:
转到src,bin和jni文件夹所在的目录(所以我们可以使用相对path到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”---------------------------- + | | | | | | | | | | | | | | | | | | | | | | | path到android.jar --------- + ----------------------------------- ---- + | | | | | | | | | | | | | | | | | | | | | | | | 分号(;)重要! -------------------------------------------------- + | | | | | | | | | | 你可以使用源代码目录(是的,你可以!)(OR / bin / classes / dir)----- + | | | | | | | | 输出文件的位置(cn_Ragnarok_NativeFilterFunc.h)----------- + --- + | | | | 点(。)指定了.java源文件的完整包名称path,文件名为-------- + | | 一个java类的文件名-------------------------------------------- ----------------------------------------- + 对于Windows e'g上的Android Studio:^ cd C:\ Android \ workspace5 \ AndroidImageFilter \ app \ src \ main | 和usr java的INSTEAD src -------------------------------------------- -------- +

请参阅http://kn-gloryo.github.io/Build_NDK_AndroidStudio_detail/以获取更好的方法。;

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