java用JNI时,会用到javah成生.h的头文件,但会报错找不到文件。
你可能打开目录后,明明看到有class文件就是报错找不到文件,是因为javah要先去找class包名。什么意思呢?
上源码吧。
如果你有一个这样的java类:
public class hello{
public static native String init(String umi);
}
注意这个类没有包名时,那么你要javah生成.h文件的时候,直接shell或者命令提示符到这个java类所在的目录下,用javac hello.java 先生成class文件,就可以看到多了一个hello.class的文件,这时你就可以javah hello生成.h的文件了。生成的.h文件在当前目录,即class文件所在的目录。
如果这个类有包名时,如这样的:
com.company.helloworldproject.Class
public class hello{
public static native String init(String umi);
}
那么,这个类的完整目录差不多是在这里的:D:\my\app\src\main\java\com\company\helloworldproject\Class, (后面以这个目录为例)这时shell或者命令提示符到你项目的文件夹java目录下,运行javah 包名.类名即 javah com.company.helloworlproject.class.hello就可以直接生成.h文件了,都不用javac先生成class文件。
总结一下:javah生成.h文件时,如果你的java类是有包名时,不应该到class文件所在的目录运行javah命令,而应该在包名的上一个目录运行,即运行:javah 包名+类名.class,生成的.h文件在java目录。
如果java类是没有包名时,javah 直在shell到class文件所在的目录运行:javah 类名.class.