在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
在另一个目录中写入标题 -
javah
在your/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