我有这样一个Java类
package com.jni;
public class HelloJni {
static {
try {
System.loadLibrary("HelloJni");
} catch (UnsatisfiedLinkError e) {
e.printStackTrace();
}
}
public native static void sayHello();
}
现在需要将它编译出一个.h头文件。
一、获取class文件
我们首先需要将 .java 文件编译成 .class 文件,有以下几种方式
1. 使用命令
首先进入java文件所在目录,然后使用命令:javac fileName.java,如下所示:
注意:这样只能编译简单的java类,如果该java类中引用了其他对象,也就是持有其他类的引用的话,就不行啦。
2. 使用IDE来编译(简单方便)
二、编译出 .h 文件
通过前面流程已经得到了class文件,接下来就把它编译成.h头文件。
如果class文件存放在项目目录下,使用如下命令:
-o 参数的意思是指定输出的.h头文件的名字,这个头文件会生成在执行命令那个目录
如果想要指定输出的位置就用 -d 参数,如下:
javah -d E:\Test\ com.jni.HelloJni
只不过这个命令生成的文件名是包含包名的,会是这样:com_jni_HelloJni.h。自己重命名就行了。
注意:在执行这个命令的时候一定要进入到第一个包名的同级目录去执行,这里就是 com 所在目录。
如果这个class不在项目目录下,就需要增加一个参数 -classpath 去指定项目的路径:
如果执行 javah 命令报错找不到类或者出现这种错误:
Exception in thread "main" java.lang.IllegalArgumentException: Not a valid class name: .\HelloJni.class
at com.sun.tools.javac.api.JavacTool.getTask(JavacTool.java:129)
at com.sun.tools.javac.api.JavacTool.getTask(JavacTool.java:107)
at com.sun.tools.javac.api.JavacTool.getTask(JavacTool.java:64)
at com.sun.tools.javah.JavahTask.run(JavahTask.java:503)
at com.sun.tools.javah.JavahTask.run(JavahTask.java:329)
at com.sun.tools.javah.Main.main(Main.java:46)
大多数情况都是执行命名时,所处的位置错了。执行这个命令一定要带上包名才行。既然要带上包名,那么执行命令时,就要在包所在位置去执行,要不然就用 -classpath 参数去指定。
技 术 无 他, 唯 有 熟 尔。
知 其 然, 也 知 其 所 以 然。
踏 实 一 些, 不 要 着 急, 你 想 要 的 岁 月 都 会 给 你。