在练习使用JNI的过程中,发现使用javah工具执行class总是失败,提示信息是:
dr@drBox:~/Desktop/javach$ javah JniTest
error: cannot access JniTest
bad class file: ./JniTest.class
class file contains wrong class: dingran.jni.test.JniTest
Please remove or make sure it appears in the correct subdirectory of the classpath.
com.sun.tools.javac.util.Abort
at com.sun.tools.javac.comp.Check.completionError(Check.java:164)
at com.sun.tools.javadoc.DocEnv.loadClass(DocEnv.java:149)
at com.sun.tools.javadoc.RootDocImpl.<init>(RootDocImpl.java:77)
at com.sun.tools.javadoc.JavadocTool.getRootDocImpl(JavadocTool.java:159)
at com.sun.tools.javadoc.Start.parseAndExecute(Start.java:330)
at com.sun.tools.javadoc.Start.begin(Start.java:128)
at com.sun.tools.javadoc.Main.execute(Main.java:66)
at com.sun.tools.javah.Main.main(Main.java:147)
javadoc: error - fatal error
2 errors
说是找不到文件,可是这个class文件明明在这呢,猜想可能是格式有问题,无法识别。
那么我看了用javac工具执行的JniTest.java文件,修改后成功了,发现是因为
不能有package;这句话,是这个导致了执行出的class文件不能识别。
具体过程如下:
1.新建JniTest.java文件,里面有执行jni的方法。
2.
dr@drBox:~/Desktop/javach$ javac JniTest.java
dr@drBox:~/Desktop/javach$ ls
JniTest.class JniTest.java JniTest.java~
dr@drBox:~/Desktop/javach$ javah JniTest
dr@drBox:~/Desktop/javach$ ls
JniTest.class JniTest.h JniTest.java JniTest.java~
3.这个JniTest.h文件就是我们要的了,ok,成功了。
补充,20120316
上面的方式容易带来问题,不建议把文件拷贝出来弄。
这样生成的头文件的函数名称没有包含java文件的包名,还得人工添加。
方法是:
用javah生成.h头文件
对于安卓工程而言:
1.首先进入bin目录里。
2.执行命令:
javah -classpath classes -jni com.eoeandroid.ndk.Jnitest
解释:classes是个目录,里面是eclipse编译生成的class文件,后面的com...是包名路径下面对应的class文件的名字。
3.生成的.h头文件在根目录下。
注意:如果是单拿出这个.java文件用javac生成class文件,然后再用javah生成.h头文件的话,做法比较麻烦,
还得做很多处理,最后使用起来.h里面的函数名称还不包含我们的包名,需手工添加。所以这种方式不可行,剧麻烦。
分享到:
相关推荐
ewrwrtwtwetwetwtwtwetwetwfdsfsdfs ydrrydghdfhd[ fsddgsdg
JavaH指数.doc
在Android Studio3.0上用javah方式编译jni,并解决新问题
javah命令生成的后缀是.h的c语言的头文件,
JNI开发之javah生成静态和非静态的两个头文件区别
①编写Java文件,编译成class文件,利用javah将class文件生成头文件。 ②编写c/c++文件,实现之前头文件中所定义的的函数。 ③编写Android.mk(自定义要编译的文件、标签等)和Application.mk(编译的架构)文件。 ...
java – 运行编译后的java程序(.class后缀的) appletviewer:小程序浏览器,一种执行HTML文件上的Java小程序的Java浏览器。 Javah:产生可以调用Java过程的C过程,或建立能被Java程序调用的C过程的头文件。 ...
放入到JDK的BIN目录中运行AxulRun文件即可。
图片详细说明配置步骤,供9张截图
Java接入H5微信支付源码,详细教程—https://blog.csdn.net/happy_yk/article/details/84862727#_5
没有JDK的话,无法编译Java程序(指java源码.java文件),如果想只运行Java程序(指class或jar或其它归档文件),要确保已安装相应的JRE。 版本:jdk1.8 适用于java开发的jar包 jdk1.8新特性 Java 8允许我们给接口...
4. 利用命令生成相应的头文件,在根目录下执行:javah -classpath bin/classes -d jni com.xxx.hello.HelloJni ————————————— ——————— ^ ^ 包名 类名 5. 编写相应的.c文件(hello-jni.c) #...
java – 运行编译后的java程序(.class后缀的) appletviewer:小程序浏览器,一种执行HTML文件上的Java小程序的Java浏览器。 Javah:产生可以调用Java过程的C过程,或建立能被Java程序调用的C过程的头文件。 Javap...
java – 运行编译后的java程序(.class后缀的) appletviewer:小程序浏览器,一种执行HTML文件上的Java小程序的Java浏览器。 Javah:产生可以调用Java过程的C过程,或建立能被Java程序调用的C过程的头文件。 Javap...
可用于毕业设计,博客网站后端设计,javaweb+javah后端代码+芝麻开门博客网站后端代码
使用Java的FileDescriptor来操作...②使用javac将.java编译成.class文件,然后使用javah编译相应的头文件 ③实现相关的.c/.cpp文件(实现头文件中定义的函数) ④编写Android.mk和Aplication.mk文件 ⑤利用ndk编译so库。
由于jni技术需要先通过javah+.class文件生成.h开头的c头文件,jsp是一种特殊的class文件,而jsp经过Tomcat编译class文件,命名遵从test.jsp ->> org.apache.jsp.test_jsp.class,所以我们需要新建package为org....
用javah导出类的头文件常见的错误及正确的使用方法.docx
本人根据学习jdk命令 总结的一套jdk命令大全 日后还会有更新 请谅解编写仓促
生成HelloWorld.class文件 有package时,输入命令: javac jnitest/HelloWorld.java 输入命令: javah -jni HelloWorld 生成HelloWorld.h文件(若提示找不到HelloWorld类文件,Java代码中不要写package) 有...