经常使用java的同学一定都接触过JNI(Java Native Interface)吧。JNI为我们提供了java<---->C/C++之间的接口,使得我们可以在java中调用C程序,以便实现一些计算复杂度较高的程序(如图像处理、信号处理等)。另外,也方便我们使用很多优秀的C库。
使用javah生成本地方法头文件
JNI怎么使用在这里我就不介绍了。今天主要来说一下JNI的本地方法头文件如何生成,以及怎么方便地在eclipse中一键生成。当你使用JNI时,需要在你的java程序中声明一个类,并且用native关键字来表明该类中的方法是使用本地方法(一般是C/C++)实现的。比如下面给出了一个简单的例子:
package com.jni.test;
public class Example {
public native String jni_test();
static {
System.loadLibrary("Example");
}
}
这里定义了一个本地方法jni_test,该方法返回一个String。其中System.loadLibrary是用来加载本地库的(dll或者so)。
有了这个类以后,就可以调用javac命令编译,得到Example.class文件,然后就可以使用编译好的.class文件来生成头文件了。
在java中,提供了javah这个命令来生成本地方法的头文件。使用命令如下:
javah -classpath A -d B -jni C
其中,A是你的.class文件的路径,这样java就可以搜索到这个.class文件。B是将要生成的头文件的存放目录,可以根据需要指定。C是java类名,在这个例子中就是com.jni.test.Example。然后就可以在B目录下看到生成的头文件了。
在eclipse中一键调用javah自动生成头文件
可是,这样不是有些麻烦吗???
可不是嘛,有了.class后还要在命令行里敲入javah那一串命令,对刚刚在eclipse中定义了本地方法的开发者来说显得过于繁琐了。如果能够在eclipse中定义好本地方法后,直接生成相应的头文件,那该多方便啊。别急,我这里就介绍一个方法。
首先在eclipse中点击下图图标的下拉菜单
然后点击External Tools Configurations
会弹出下面的页面,然后在那3个地方分别填入下图中的命令
其实,这里的操作就是把javah这个可执行程序当做外部工具引入eclipse中来了。调用的时候,eclipse就会执行javah,并且使用预设的arguments,即:
javah -classpath .;./classes -d "${project_loc} -jni ${java_type_name}"
可以看到,.class文件的搜索目录是当前工作目录和子目录classes(android开发时生成的.class是在classes这个子目录中,所以这里也加了这个目录,如果你不搞android开发,那不加这个目录也没关系)。当前工作目录就是上面设好的${project_loc}/bin,也就是你这个java工程的bin文件夹。这样javah就可以在该目录下找到本地方法的.class文件。-d "${project_loc}"是为了让生成好的.h头文件直接被放置在java工程目录下,便于后续操作。 最后的${java_type_name}是动态的参数,你在生成.h头文件之前先在eclipse中选中本地方法那个java文件,这样java_type_name就自动变成了这个本地方法的名字。
设置好以后,我们来试着生成一下头文件,先在eclipse中选中刚刚定义好的本地方法Example.java,然后点击下图中的位置来调用javah这个外部工具,就可以自动生成头文件了(需要在当前工程中刷新一下才能看到)。
这样设置好以后,将来各位同学在需要生成头文件时,只需写好本地方法的java类,然后鼠标点击一下就能够自动生成头文件了,是不是很方便啊。
这篇日志就到这里,我们下文再见~~~