命令:
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
错误。
任何解决方案都会有所帮助。
答案 0 :(得分:81)
尝试
javah -jni com.example.JavaHowTo
其中com.example
是你的包裹。
您还需要从包含com/example/JavaHowTo.class
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)
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
更喜欢路径à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