`
dingran
  • 浏览: 376707 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

javah执行class文件失败原因调查

    博客分类:
  • JNI
JNI 
阅读更多

在练习使用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里面的函数名称还不包含我们的包名,需手工添加。所以这种方式不可行,剧麻烦。

分享到:
评论

相关推荐

    javah h h h guu

    在【压缩包子文件的文件名称列表】中,"bsjava730.exe" 可能是一个 Java 开发相关的可执行程序,可能是某种版本的 Java 虚拟机(JVM)、开发工具包(JDK)或者与 Java 开发相关的工具。"说明_Readme.html" 通常包含...

    用javah导出类的头文件常见的错误及正确的使用方法.docx

    确保你在类文件所在的目录下执行`javah`命令,或者正确设置`-classpath`参数,使其指向包含类文件的目录。 4. **错误四:系统类路径设置不正确** 如果类文件位于JDK的标准库或其他系统路径之外,需要设置系统类...

    javah编译jni

    2. **运行javah**:在命令行中,导航到包含`.class`文件的目录,然后执行javah命令。例如: ```bash javah -jni com.example.myapp.MyJNI ``` 这将生成一个`com_example_myapp_MyJNI.h`头文件。 3. **编写C/C++代码...

    JDK命令学习 javac java javah jdb

    javah 命令是 Java Header 文件生成器,用于生成 C Header 文件。javah 命令可以将 Java 类转换成 C Header 文件,从而实现 Java 和 C 之间的交互。 五、JDB 调试工具 JDB 是 Java 的调试工具,用于调试 Java 应用...

    JNI开发之javah生成静态和非静态的两个头文件区别代码

    1. 编译Java类并生成`.class`文件。 2. 使用`javah`生成头文件: - 非静态方式:`javah com.example.MyClass` - 静态方式:`javah -static com.example.MyClass` 3. 根据生成的头文件编写C/C++代码实现本地方法。 ...

    Java调用C(动态SO文件)接口开发说明书

    例如,在示例中,我们创建了一个native的公用方法,通过javah命令生成C代码来实现方法,该方法的C函数原型是通过对class文件使用javah实用程序来创建的,而class文件是通过编译Java文件生成的。 三、C代码的生成和...

    javah命令生成的头文件

    javah命令生成的后缀是.h的c语言的头文件,

    JNI生成文件

    在描述中提到的`AxulRun`文件,可能是执行这些步骤的一个自动化脚本或者工具。它可能封装了从生成头文件到运行Java程序的全部过程,用户只需将它放到JDK的`bin`目录,然后执行即可。不过,具体`AxulRun`是如何工作的...

    JavaH指数.doc

    JavaH指数,也称为H指数,是衡量科研人员学术影响力的一种指标。这个概念是由物理学家乔治·赫希在2005年提出的,用于评估科学家的科研成果质量和影响力。H指数考虑了研究者发表的论文数量和这些论文的被引用次数,...

    Eclipse 配置 Javah NDK 编译

    8. **运行构建**: 现在,每次修改C/C++代码后,只需重新构建项目,Eclipse会自动调用NDK进行编译。生成的.so库文件会自动添加到项目的`libs`目录下,Eclipse会处理相应的ABI分发。 9. **使用生成的.so库**: 在Java...

    qt调用JAVA文件示例

    6. **打包和运行**:确保你的Java类(`.class`文件)被包含在最终的APK中,然后编译并运行QT项目。在Android设备上,你将看到C++代码成功调用了Java方法并显示了结果。 总结来说,QT调用JAVA文件的关键在于使用...

    JavaH5微信支付

    JavaH5微信支付是将Java技术与微信支付接口结合,为用户提供在网页上进行支付的服务。这个技术主要用于电商网站、移动应用等场景,方便用户在H5环境下完成交易。接入H5微信支付需要理解以下几个核心知识点: 1. **...

    Android JNI实例

    ①编写Java文件,编译成class文件,利用javah将class文件生成头文件。 ②编写c/c++文件,实现之前头文件中所定义的的函数。 ③编写Android.mk(自定义要编译的文件、标签等)和Application.mk(编译的架构)文件。 ...

    java调用c代码:AVA通过JNI调用本地方法,而本地方法是以库文件的形式存放的(在WINDOWS平台上是DLL文件形式,在UNIX机器上是SO文件形式 )。通过调用本地的库文件的内部方法,使JAVA可以实现和本地机器的紧密联系,调用系统级的各接口方法

    例如,对于`testdll.class`,运行`javah TestDLL`将生成`TestDLL.h`。 3. **编写C代码并实现本地方法**: 根据生成的C头文件,你需要实现这些本地方法。例如,头文件可能包含如下内容: ```c JNIEXPORT jint ...

    JAVA调用C/C++ DLL文件方法

    编译该 JAVA 程序文件,生成 CLASS,再用 JAVAH 命令,JNI 就会生成 C/C++ 的头文件。例如程序 testdll.java,内容为: public class testdll { static {System.loadLibrary("goodluck");} public native static ...

    JavaEE所需的配置文件(JDK,JRE)

    java – 运行编译后的java程序(.class后缀的) appletviewer:小程序浏览器,一种执行HTML文件上的Java小程序的Java浏览器。 Javah:产生可以调用Java过程的C过程,或建立能被Java程序调用的C过程的头文件。 ...

    Java安装后JDK_bin目录下exe文件用途

    `javac`是Java开发工具包(JDK)中的编译器,负责将编写好的Java源代码转换成字节码(.class文件),这些字节码可以在任何支持Java的平台上运行,实现了Java的“一次编写,到处运行”(Write Once, Run Anywhere)的特性。...

    AndroidStudio 编译C/C++文件生成SO文件

    在Android开发中,有时我们需要利用C或C++的性能优势,这时就需要用到Android Studio的NDK(Native Development Kit)来编译C/C++代码,生成SO(Shared Object)动态链接库文件。这篇博客详细介绍了如何在Android ...

    android jni使用libzip读取压缩文件

    然后,使用`javah`命令生成对应的C/C++头文件,这个头文件将定义JNI函数原型。 接下来,在C/C++代码中实现`readZipFromAssets`函数。首先,打开assets中的ZIP文件,然后使用libzip API读取其中的文件。这里可能需要...

Global site tag (gtag.js) - Google Analytics